我必须创建一个函数bitParity(int x),它取一个整数,如果x的位形式有一个奇数0,则返回1,否则返回0。
Ex: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);
}
答案 0 :(得分:0)
此函数基本上xor
输入数字的所有位并将其置于LSB,因此如果有1
个奇数,则给出1
。
工作原理:
8-bit
,说11001001
。 8-bit
输入,您需要从第3个代码声明开始:x = ( x >> 4 ) ^ x;
这样做(步骤1),你得到:
x 7 x 6 x 5 x 4 x 7 ^ x 3 x 6 ^ x 2 x 5 ^ x 1 x 4 子> ^ X <子> 0 子>
其中x i 表示ith
的{{1}}位。
现在第2步:x
给出:
x 6 ^ x 2 ^ x 4 ^ x 0 },和
{{sub> 7 ^ x 3 ^ x 5 ^ x 1 位于x = ( x >> 2 ) ^ x;
的{{1}} 1}}。休息位置无关紧要。
第3步:x
最终给出:
X <子> 6 子> ^ X <子> 2 子> ^ X <子> 4 子> ^ X <子> 0 子> ^ X <子> 7 在1
的LSB处,sub> ^ x 3 ^ x 5 ^ x 1 。
最后一步:x
返回此表达式的值,x = ( x >> 1 ) ^ x;
中x
的所有位return (x & 1);
当{且仅当数字为xor
时x
中的1
s是奇数。
您可以将其扩展为1
,x
或16-bit
个数字。
此外,请注意找到奇数32-bit
s相当于找到奇数64-bit
s ,因为0
的总数s和1
加起来为偶数位。
因此,上面的代码应该可以正常使用