我试图找到一个比特串的奇偶性,如果x有奇数个0,则返回1。
我只能使用基本的按位操作,目前我的代码已经通过了大部分测试,但我想知道两件事:
为什么 x ^ (x + ~1) 能够工作?我偶然发现这个方法,它似乎可以在有奇数个比特时给出1,而在偶数个比特时给出其他结果。例如 7^6 = 1,因为 7 = 0b0111
这是解决这个问题的正确方向吗?我认为我的问题源于第一步操作,特别是 (x + ~1),因为它可能会导致某些2的补码数字溢出。谢谢。
代码:
int bitParity(int x) {
int first = x ^ (x + ~1);
int second = first ^ 1; // if first XOR gave 1 you'll return 0 here
int result = !!second;
return result;
}
int
,因为会发生溢出,这将导致未定义的行为。相反,请使用unsigned
和1u
,这样可以定义好环绕行为。 - Jens Gustedt