C 位奇偶校验器-计算有多少个0';位向量中的s

C 位奇偶校验器-计算有多少个0';位向量中的s,c,bit-manipulation,bitwise-operators,bitwise-xor,C,Bit Manipulation,Bitwise Operators,Bitwise Xor,我在研究逐位运算符和位操作时偶然发现了以下线程: 总之,用户需要一个函数,int-bitParity(intx),如果传入的整数的两个补码表示中有奇数0,则该函数返回1,否则,该函数返回0。所有这些都必须只使用位运算符来完成 我不太可能理解大家接受的回答,我希望能对此有所了解 解决方案: x ^= x >> 16 x ^= x >> 8 x ^= x >> 4 x ^= x >> 2 x ^= x >> 1 x &= 1; 从

我在研究逐位运算符和位操作时偶然发现了以下线程:

总之,用户需要一个函数,
int-bitParity(intx)
,如果传入的整数的两个补码表示中有奇数0,则该函数返回1,否则,该函数返回0。所有这些都必须只使用位运算符来完成

我不太可能理解大家接受的回答,我希望能对此有所了解

解决方案:

x ^= x >> 16
x ^= x >> 8
x ^= x >> 4
x ^= x >> 2
x ^= x >> 1
x &= 1;
从我所能收集到的信息来看,两个相同长度的连续子位向量之间的异或结果总是与原始位向量具有相同的奇偶校验0。因此,通过对位向量及其移位计数器部分重复应用XOR运算符,直到达到长度为1的子位向量,可以将结果链接到整个原始位向量。如能更正我的想法并作进一步解释,将不胜感激


考虑到右移是一种算术右移,因为
x
是一个有符号值,我对右移如何创建“子向量”感到困惑。我也不明白为什么两个子位向量网络之间的异或会有奇数0,当且仅当原始值有奇数时。

32位值的奇偶校验可以通过将所有位与

parity = bit0 ^ bit1 ^ bit2 ^ ... ^ bit31
在C中,这可以表示为:

int奇偶校验=x&1;//隔离x的最低有效位
奇偶校验^=(x>>1)&1;//隔离x的第二个最低有效位
//并将其与中间值一起xor
//在这里,从2到30的班次数量相同
奇偶校验^=(x>>31)&1;//分离x的最高有效位
//并将其与中间值一起xor
这将是31个操作,应该在这里进行优化。为此,单个位不再是孤立的,而是一次尽可能多的:在行中

x^=x>>16
发生以下情况:

x before: | bit0         | bit1         |     | bit15
x >> 16:  | bit16,       | bit17,       | ... | bit31
----------+--------------+--------------+-----+-------------
x after:  | bit0 ^ bit16 | bit1 ^ bit17 | ... | bit15 ^ bit31
x的16位到31位保持不变,但在以下情况下不需要它们。这只剩下现在要处理的所有位的一半:

before: | bit0 ^ bit16                | ... | bit1 ^ bit23
>> 8 :  | bit8 ^ bit24                | ... | bit7 ^ bit31
--------+-----------------------------+-----+---------------------------
after:  | bit0 ^ bit8 ^ bit16 ^ bit32 | ... | bit1 ^ bit7 ^bit23 ^ bit31
与上一步相比,位8到15保持不变。写下其他三个步骤太令人困惑了。最后,所寻求的值(奇偶校验)包含在
x
的最低有效位中。其他位元则以

x&=1;