在 int 变量中查找 '1 数的奇偶校验

Finding parity of number of '1's in a int variable

本文关键字:奇偶 偶校验 变量 int 查找      更新时间:2023-10-16

给定一个int变量,我想检查它的二进制表示中的'1'是偶数还是奇数。它可以通过像

这样的xor操作来实现。
int n; 
int s = 0;
for(;n;n>>=1)
    s ^= (n&1);
在c++中有更好的方法吗?

注意:我不是要求'1'的数量,而是要求它的奇偶性,所以我认为可能有一些比我的更好的代码。

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的确切数目

如果您确实追求速度,您可以将所有字节值0..255的位数(或其奇偶校验)制表。然后在变量上映射一个联合或使用移位/掩码,为四个字节累积。

更快,更偏执,为所有短值0..65535制表