2011-06-16 241 views

回答

9
(v & 0xffffffff)^((v >> 32) & 0xffffffff) 
+2

严格地说第二位掩码是没有必要的。 – 2011-06-16 11:25:15

+1

即使变量被签名? – 2011-06-16 11:25:48

+0

@Ignacio有符号整数的位运算... *不寒而栗*。不,你说得对。 – 2011-06-16 11:28:39

1

只是踢,这是另一种解决方案。已经给出的可能是要走的路。

uint32_t* number32; 
uint64_t number64 = 0xffff1111ffffffff; 
uint32_t xorValue; 

number32 = (uint32_t*)&number64; 
xorValue = number32[0]^number32[1]; 
+0

看起来像如果你使用别名假设,你的编译器不会那样。 – 2011-06-16 11:53:39

0
uint32_t hi_low_xor(uint64_t x) { 
    return static_cast<uint32_t>(x)^static_cast<uint32_t>(x >> 32); 
} 
+0

错了。结果可能超过32位,这显然是不正确的。 – 2011-06-16 12:48:18

+0

@Artem。这不是真的。一对32位数的XOR总是32位数。 – 2011-06-22 13:11:39

0

,如果你想将结果存储在低32位:

(v & 0xffffffff)^((v >> 32)) 

,如果你想将结果保存在高32位:

((v & 0xffffffff)^((v >> 32))) << 32