计算二进制字的奇偶校验

时间:2016-08-09 23:27:14

标签: java algorithm bit-manipulation

我有以下代码来计算二进制字的奇偶校验:

    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;
    }

1 个答案:

答案 0 :(得分:2)

您发布的代码看起来是正确的,这让我觉得您可能会错误地调用它。你给了1011作为一个数字的例子,即使你得到0,奇偶校验应该是1。如果你使用二进制数字1011(十进制:11),那么你应该得到1,但是如果您使用十进制编号1,011(一千一十一),那么您应该得到0,因为它的二进制表示是

1111110011

其中偶数为1。

如果要调用二进制数为1011的函数,请将其作为

调用
parity(0b1011)

而不是

parity(1011).