判断x二进制编码中1的个数的奇偶性
书上的代码是:
short test_one(unsigned short x) {
// 如果x二进制中有偶数个1, 返回1, 否则返回0
short val = 1;
while (x) {
val ^= x;
x >>= 1;
}
return val & 1;
}
但重点不在于这个功能本身, 而是想探讨一下xor.
仅仅是一位的时候, xor与1有奇妙的关系, 那就是遇到1必然翻转(也就是从1变为0, 或者从0变为1), 遇到0不翻转.
若开始为1,那么遇到1翻转为0,遇到0不翻转.
若开始为0,那么遇到1翻转为1,遇到0不翻转.
这就可以解释为什么上面的代码work了, 如果返回是1, 而val一开始就是1, 那也就表示没变, 说明翻转了偶数次, 因此x有偶数个1, 反之同理.