如何解释函数计数的位数是奇数还是偶数

时间:2012-05-28 09:54:37

标签: c++ c bit-manipulation

在“计算机系统”上找到了这个功能:

int fun_a(unsigned x){
    int val = 0;
    while(x){
        val ^= x;
        x >>= 1;
    }
    return val & 0x1;
}

如果x包含奇数“1”则返回1,如果x包含偶数“1”则返回0。 我知道“val& 0x1”检查val是奇数还是偶数,但我不知道它如何计算val上的位数。

2 个答案:

答案 0 :(得分:4)

它并不完全对这些位进行计数,但是对于val中的每个位,XOR会将x中的低位翻转一次。如果它被翻转奇数次,那将使它成为1

它还会翻转val中的许多其他位,但这是无关紧要的,因为它们在return语句中被屏蔽掉了。

答案 1 :(得分:0)

当做一点点蠢蠢欲动时,你通常不想考虑数字,而是考虑比特数组。 ^在每一位执行加法模2。由于只有val的低位很重要,它发生了什么?

但是,{p> val确实应该是未签名的,尽管大多数计算机体系结构都不会给你带来问题。实际上,在你使用这样的函数的情况下,你真的应该使用固定宽度的整数类型,比如uint32_t