题目描述:
/* Return 1 when x contains an even number of 1s;0 otherwise. Assume W=32 */
int even_ones(unsigned x);
函数应该遵循位级整数编码规则,不过你可以假设数据类型int 有w=32位。
你的代码最多只能包含12个算术运算、位运算和逻辑运算。
代码如下:
bool OddOnes(int x)
{
x = x ^ (x >> 1);
x = x ^ (x >> 2);
x = x ^ (x >> 4);
x = x ^ (x >> 8);
x = x ^ (x >> 16);
return !(x & 1);
}
分析:
我在这里引用网友Matrix67的部分分析:
为了说明上面这段代码的原理,我们拿1314520出来说事。1314520的二进制为101000000111011011000,第一次异或操作的结果如下:
00000000000101000000111011011000
XOR 0000000000010100000011101101100
---------------------------------------
00000000000111100000100110110100
得到的结果是一个新的二进制数,其中右起第i位上的数表示原数中第i和i+1位上有奇数个1还是偶数个1。比如,最右边那个0表示原数末两位有偶数个1,右起第3位上的1就表示原数的这个位置和前一个位置中