我想要或两大块记忆......但它不起作用
考虑我有三个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 :(得分:3)
将to_uint64
的定义括在括号()
中而不是括号{}
中,并在最后删除分号。使用#define
创建一个宏,其文本在任何地方逐字插入,而不是实际函数,因此您尝试|
- 一起两个块而不是那些块'“返回值。”
答案 1 :(得分:2)
我认为您需要按正确的大小推进输出指针:
memcpy(bm_res + i * sizeof(uint64_t), &or_res, sizeof(uint64_t));
^^^^^^^^^^^^^^^^^^^^
由于bm_res
是一个字符指针,+ 1
只前进一个字节。
答案 2 :(得分:2)
对于移动的每个八字节块,您将bm_res
递增一。此外,您根本不会增加bm
或bm_old
。所以你基本上将or_res
的第一个字节平铺在bm_res
之上,这可能不是你想要的。
更重要的是,您的代码是字节顺序敏感的 - 无论or_res
在内存中表示为最低位字节优先还是最高位字节优先。
我建议您只是逐个字节地执行,或者只是尝试优化它,如果它太慢的话。当你对它进行优化时,不要在那里使用你疯狂的to_uint64
宏 - 它会比逐字节更慢。相反,直接转换为uint64_t *
。虽然这严格来说是未定义的行为,但它适用于我见过的每个平台,并且应该是字节顺序不可知的。