我在查找位奇偶校验时遇到了这段代码,几乎不知道为什么会这样。有人能够启发我的算法吗?
x ^= x >> 16
x ^= x >> 8
x ^= x >> 4
x ^= x >> 2
x ^= x >> 1
x &= 1;
答案 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
。抛弃所有高位,留下一位结果。