1

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

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 上的位数。

4

2 回答 2

4

它不会精确计算位,但 XOR 会valx. 1如果它被翻转奇数次,那将使它成为一个。

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

于 2012-05-28T09:59:50.323 回答
0

在进行位旋转时,您通常不想考虑数字,而是考虑位数组。^对每一位执行加法 mod 2。既然只有低位的val事情,它发生了什么?

val不过,确实应该是无符号的,尽管大多数计算机体系结构不会给您带来问题。真的,在你使用这样的函数的情况下,你真的应该使用固定宽度的整数类型,比如uint32_t.

于 2012-05-28T10:06:35.707 回答