奇数位的比特码

时间:2015-02-04 19:54:17

标签: c bit-manipulation parity

我在查找位奇偶校验时遇到了这段代码,几乎不知道为什么会这样。有人能够启发我的算法吗?

x ^= x >> 16
x ^= x >> 8
x ^= x >> 4
x ^= x >> 2
x ^= x >> 1

x &= 1;

2 个答案:

答案 0 :(得分:1)

第一行将高16位反转为低16位。

第二行将低16位的高半部分反转为低半部分。

在最后一行之前,低位包含初始32位的奇偶校验,但其他位包含中间结果(垃圾)。最后一行清除所有垃圾位。

每行占用剩余值的一半,并将其与另一半进行异或。总的来说,因为XOR运算是关联的和可交换的,所以这与单独对每个位进行异或运算相同。

答案 1 :(得分:0)

你将32位折叠到16位,然后是16到8,......最后是2到1.折叠如何工作?好吧,让我们举一个简单的例子,以4位数字开头(以二进制显示)

x = 1110

要使用x ^= x >> 2折叠,计算结果为

1110      // x three bits, odd parity
0011      // x >> 2
----
xx01      // after the XOR, ignoring the upper bits

此时,我们将4位折叠为2,我们只关心2 {lsbs} 01。注意,奇偶校验已被保留,一位设置,奇偶校验仍然是奇数。那是怎么发生的?如果你只检查低两位,你会看到

10       // the lower two bits from the 4-bit number
11       // the upper two bits from the 4-bit number
01       // after exclusive-OR

异或将第一列转换为0从结果中删除两位,但保持奇偶校验相同。这就是它起作用的原因。当您在同一列中有两个1时,异或将总位数减少2。因此,如果原始位计数为奇数,则最终位计数将为奇数。如果原始位数是偶数,则最终位数将是偶数。

继续该示例,使用x ^= x >> 1

再次折叠它
01    // the lower 2 bits from the previous calculation
00    // shifted by one
--
x1    // after the XOR, ignoring the upper bits

最后一块拼图是最后的x &= 1。抛弃所有高位,留下一位结果。