找到int变量

时间:2015-10-11 13:45:59

标签: c++ binary int

给定一个int变量,我想检查一下' 1'在其二进制表示中是偶数或奇数。它可以使用像

这样的xor操作
int n; 
int s = 0;
for(;n;n>>=1)
    s ^= (n&1);

在C ++中有更好的方法吗?

注意:我不是要求#1的数量,而是因为它的奇偶校验,所以我认为可能有比我更好的代码。

2 个答案:

答案 0 :(得分:5)

uint32_t v = somevalue;
v ^= v >> 1;
v ^= v >> 2;
v = (v & 0x11111111U) * 0x11111111U;
bool parity = (v >> 28) & 1;  

来自https://graphics.stanford.edu/~seander/bithacks.html
它也有64位版本。

澄清,用"奇偶校验"如果数字在数学上是偶数或奇数,我并不意味着,如果它的二进制表示中的1位数是偶数还是奇数;如https://en.wikipedia.org/wiki/Parity_bit中所述。有了数学意义,问题中的代码毫无意义,所以我认为OP意味着相同。声明

  

我不是要求' 1' 1的数量,而是要求其平价

然后意味着他/她只想知道1个计数是偶数还是奇数,
但不是1的准确数量。

答案 1 :(得分:1)

如果您真的在速度之后,可以将所有字节值0..255的位数(或仅其奇偶校验)制成表格。然后在变量上映射联合或使用移位/掩码,累加四个字节。

更快,更偏执,列出所有短值0..65535。