/*
* 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);
}
以上代码不起作用
答案 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。