在“计算机系统”上找到了这个功能:
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上的位数。
答案 0 :(得分:4)
它并不完全对这些位进行计数,但是对于val
中的每个位,XOR会将x
中的低位翻转一次。如果它被翻转奇数次,那将使它成为1
。
它还会翻转val
中的许多其他位,但这是无关紧要的,因为它们在return语句中被屏蔽掉了。
答案 1 :(得分:0)
当做一点点蠢蠢欲动时,你通常不想考虑数字,而是考虑比特数组。 ^
在每一位执行加法模2。由于只有val
的低位很重要,它发生了什么?
val
确实应该是未签名的,尽管大多数计算机体系结构都不会给你带来问题。实际上,在你使用这样的函数的情况下,你真的应该使用固定宽度的整数类型,比如uint32_t
。