异或如何计算位奇偶性?

时间:2018-09-24 08:26:59

标签: bit-manipulation bit-shift

/*
 * 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);
}

嗨,我试图解决这个问题,但失败了。

所以我在Google上搜索了答案。

google上可用的大多数解决方案彼此不同,

但是在这个位奇偶问题中,答案都是相同的(使用xor)

我知道询问此代码或该代码的工作方式是错误的,

所以我想知道机制或想法。

如果您对我的想法有所了解,那将非常有帮助。

几天无法解决此问题,需要一些帮助

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 个答案:

答案 0 :(得分:2)

使用调试器,您可以逐行遵循语句流:

x = ( x >> 16 ) ^ x;

计算最高(最高有效)16位和最低(最低有效)16位的按位xor。以后仅考虑结果的低16位。整数的上半部分向右/下移16位。

  x = ( x >> 8 ) ^ x;

计算前一个结果的高8位和低8位的按位xor

  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的最低有效位,奇数x为1,偶数x为0。