给定一个int变量,我想检查一下' 1'在其二进制表示中是偶数或奇数。它可以使用像
这样的xor操作int n;
int s = 0;
for(;n;n>>=1)
s ^= (n&1);
在C ++中有更好的方法吗?
注意:我不是要求#1的数量,而是因为它的奇偶校验,所以我认为可能有比我更好的代码。
答案 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。