2011-09-26 63 views
0

我想要或兩個大塊的內存......但它不起作用內存塊之間的邏輯運算?

考慮我有三個char * bm,bm_old和bm_res。

#define to_uint64(buffer,n) {(uint64_t)buffer[n] << 56 | (uint64_t)buffer[n+1] << 48 |  (uint64_t)buffer[n+2] << 40 | (uint64_t)buffer[n+3] << 32 | (uint64_t) buffer[n+4] << 24 | (uint64_t)buffer[n+5] << 16 | (uint64_t)buffer[n+6] << 8 | (uint64_t)buffer[n+7];} 

... 

for (unsigned int i=0; i<bitmapsize(size)/8; i++){ 
     uint64_t or_res = (to_uint64(bm_old,i*8)) | (to_uint64(bm,i*8)); 
     memcpy(bm_res+i*sizeof(uint64_t), &or_res, sizeof(uint64_t)); 
} 

bm_res不正確!

有什麼線索?

謝謝,

埃米爾。

+0

爲什麼不簡單地'reinterpret_cast'緩衝區? –

+0

@ K-ballo,嚴格來說這是未定義的行爲。但它也比這更簡單也可能更快... – bdonlan

+0

@ K-ballo:那會是UB。 –

回答

3

將括號to_uint64的定義括在括號()而不是大括號{}中,並在最後刪除分號。使用#define可創建一個宏,其文本逐字地插入,而不是實際的函數,因此您試圖使用| - 共兩個塊,而不是那些塊的「返回值」。

+0

我相信這將是正確的代碼! (uint64_t)buffer [n] << 56 |(uint64_t)buffer [n + 1] << 48 |(uint64_t)buffer [n + 2] << 40 |(uint64_t)#define to_uint64(buffer,n) )buffer [n + 3] << 32 |(uint64_t)buffer [n + 4] << 24 |(uint64_t)buffer [n + 5] << 16 |(uint64_t)buffer [n + 6] << 8 | (uint64_t中)緩衝液[N + 7]) ... 爲(無符號整數,I = 0; I Amir

2

我認爲你需要通過正確的尺寸來爲自己的輸出指針:

memcpy(bm_res + i * sizeof(uint64_t), &or_res, sizeof(uint64_t)); 
       ^^^^^^^^^^^^^^^^^^^^ 

由於bm_res是一個字符指針,+ 1墊款只是一個字節。

+0

是啊,你是對的! – Amir

2

對於移動的每個八字節塊,您正在將bm_res增加1。此外,您永遠不會增加bmbm_old。所以你基本上在bm_res上平鋪or_res的第一個字節,這可能不是你想要的。

更重要的是,您的代碼對字節順序敏感 - 無論是or_res在內存中表示爲最小順序字節的第一個還是最高順序的第一個問題。

我會建議你只做一個字節的字節或第一,並且只嘗試優化它,如果這太慢。當你優化它時,不要在那裏使用你瘋狂的to_uint64宏 - 它會比逐字節地慢。相反,直接投射到uint64_t *。嚴格地說,這是未定義的行爲,它適用於我見過的每個平臺,並且應該是字節順序不可知的。

+0

我知道..我在想什麼! – Amir