判断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, 反之同理.

posted @ 2020-10-19 08:38  Tokubara  阅读(283)  评论(0编辑  收藏  举报