2011-06-16 232 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