在“计算机系统”上找到功能:
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 上的位数。
在“计算机系统”上找到功能:
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 上的位数。
它不会精确计算位,但 XOR 会val
为x
. 1
如果它被翻转奇数次,那将使它成为一个。
它还会在 中翻转许多其他位val
,但这无关紧要,因为它们在 return 语句中被屏蔽了。
在进行位旋转时,您通常不想考虑数字,而是考虑位数组。^
对每一位执行加法 mod 2。既然只有低位的val
事情,它发生了什么?
val
不过,确实应该是无符号的,尽管大多数计算机体系结构不会给您带来问题。真的,在你使用这样的函数的情况下,你真的应该使用固定宽度的整数类型,比如uint32_t
.