【发布时间】:2019-10-09 07:02:05
【问题描述】:
我在 Stackoverflow 上找到了一段代码,并根据我的需要对其进行了编辑。来源:How to check if value has even parity of bits or odd?
它就像一个魅力,但我无法理解它为什么起作用。
我试着把它写出来,例如字节 0b01101101。
01101101
00000110
-------- ^
01101011
00011010
-------- ^
01110001
00111000
-------- ^
01001001
虽然我的单元测试给出了答案; 1
uint8_t check_even_parity(uint8_t value){
value ^= value >> 4;
value ^= value >> 2;
value ^= value >> 1;
return value & 1;
}
预期是; 0 尝试写出时的实际结果; 01001001
【问题讨论】:
-
别忘了最后一个
& 1。最后只有最右边的部分很重要。 -
01001001 & 1 == 1。我不明白你为什么期望它是0。 -
您的手动遍历似乎不会将值传递到下一行。 "^=" 执行 XOR,然后将值设置为 XOR 的结果。