我有以下代码来计算二进制字的奇偶校验:
public class Parity1 {
public static short parity(long x) {
short result = 0;
while (x != 0) {
result ^= (x & 1);
x >>>= 1;
}
return result;
}
如果我有像1011这样的奇数,我会得到1,否则就像100001000,我会得到0.但是,我没有看到代码是如何工作的。如果我拿1011,我通过它然后我得到以下内容:
number:1011
result : 0
result xor (1&1) == 1=>result
x >>>=1 => 0101
----------------------
number:0101
result : 1
result xor (1&1) == 0 => result
x >>>=1 => 0010
----------------------
number :0010
result : 0
result xor (0&1) ==0 => result
x >>>=1 => 0001
------------------------
number :0001
result : 0
result xor (1&1) ==1 => result
x >>>=1 => 0000
------------------------
number :0000
result : 1
result xor (1&1) ==1 => result
while (x!=0) but x(number) is 0
ends with result 0.
Can someone please explain what I am missing?
修改
这是另一种方法,它可以有效地完成同样的事情。但是,我也没有得到它。
public static short parity(long x){
short result =0;
while (x!=0){
result ^=1;
x &= (x-1);
}
return result;
}
答案 0 :(得分:2)
您发布的代码看起来是正确的,这让我觉得您可能会错误地调用它。你给了1011作为一个数字的例子,即使你得到0,奇偶校验应该是1。如果你使用二进制数字1011(十进制:11),那么你应该得到1,但是如果您使用十进制编号1,011(一千一十一),那么您应该得到0,因为它的二进制表示是
1111110011
其中偶数为1。
如果要调用二进制数为1011的函数,请将其作为
调用parity(0b1011)
而不是
parity(1011).