代码之家  ›  专栏  ›  技术社区  ›  jwkoo

xoring如何计算比特率?

  •  1
  • jwkoo  · 技术社区  · 7 年前
    /*
     * bitParity - returns 1 if x contains an odd number of 0's
     *   Examples: bitParity(5) = 0, bitParity(7) = 1
     *   Legal ops: ! ~ & ^ | + << >>
     *   Max ops: 20
     *   Rating: 4
     */
    int bitParity(int x) { //XORing two numbers returns a number with same bit parity. 
                           //Keep shifting half of our number until reduced to 1 bit simple case
      x = ( x >> 16 ) ^ x;
      x = ( x >> 8 ) ^ x;
      x = ( x >> 4 ) ^ x;
      x = ( x >> 2 ) ^ x;
      x = ( x >> 1) ^ x;
    
      return (x & 1);
    }
    

    谷歌上提供的大多数解决方案各不相同,

    但是在这个比特率问题中,答案是相同的(使用异或)

    我知道问这个或那个代码是怎么工作的是错误的,

    所以我想知道它的原理和想法。

    int bitParity(int x) {
      int x1 = ( x >> 28 ) ^ x;
      int x2 = ( x >> 24 ) ^ x1;
      int x3 = ( x >> 20 ) ^ x2;
      int x4 = ( x >> 16 ) ^ x3;
      int x5 = ( x >> 12 ) ^ x4;
      int x6 = ( x >> 8 ) ^ x5;
      int x7 = ( x >> 4 ) ^ x6;
      int x8 = ( x >> 2 ) ^ x7;
      int x9 = ( x >> 1 ) ^ x8;
      return (x9 & 1);
    }
    

    以上代码不起作用

    1 回复  |  直到 7 年前
        1
  •  2
  •   Axel Kemper    7 年前

    使用调试器,可以逐行跟踪语句流:

    x = ( x >> 16 ) ^ x;
    

    xor 较高(最高有效)的16位和较低(最低有效)的16位。只会进一步考虑结果的低16位。整数的上半部分下移/右移16位位置。

      x = ( x >> 8 ) ^ x;
    

    按位计算 异或 上一个结果的高8位和低8位。

      x = ( x >> 4 ) ^ x;
      x = ( x >> 2 ) ^ x;
      x = ( x >> 1) ^ x
    

    原来的32位折叠到16、8、4、2、1位,以收集不相等的位位置。最后,剩余的单个位指示原始32位整数中是否存在奇数个设置位。

    如果一个整数的两个半部分是异或的,则具有相同值的位位置将产生0位,而具有相反值的位位置将产生1位。因此,得到的1位表示原始整数中的位位置对,它们是不等的。一对这样的“奇数对”相互抵消。

    x & 1
    

    屏蔽的最低有效位 x 奇数是1 或0表示偶数