【发布时间】:2014-02-14 03:42:07
【问题描述】:
我一直在尝试跟踪某人为练习而编写的函数,但我似乎无法得到正确的答案。
bitParity - 如果 x 包含奇数个 0,则返回 1 示例:bitParity(5) = 0,bitParity(7) = 1
int bitParity(int x) {
x = (x >> 16) ^ x;
x = (x >> 8) ^ x;
x = (x >> 4) ^ x;
x = (x >> 2) ^ x;
x = (x >> 1) ^ x;
return x&1;
}
所以让我们以 5 为例。二进制中的 5 是 0101,有偶数个 0,所以应该返回 0。
因为 x>>2 之前的所有内容都会简单地返回 0101,所以我从行 x = (x>>2)^x
(x>>2) = 0001
(x>>2) ^ x = 0001 XOR 0101 = 0100
x 现在是 0100
然后我计算 x = (x>>1) ^ x
(x>>1) = 0010
(x>>1) ^ x = 0010 XOR 0100 = 0110
x 现在是 0110
然后我返回 (x&1),即 (0110 & 1111) = 0110
如果我正确理解所有内容,如果有偶数个 0,bitParity 应该返回全 0,例如 x = 5 这种情况。我做错了什么?
【问题讨论】:
-
顺便说一句,大多数系统都有位计数指令,您的编译器可能会将其公开为“popcount”内在函数。
标签: c logic bit-manipulation