我必须创建一个函数bitParity(int x)
,该函数需要一个整数,如果1
的位形式中存在奇数个0
,则返回x
,否则返回0
。
例如:bitParity(5) = 0, bitParity(7) = 1
但是,这很困难,因为我只能在此问题上使用位运算符(! ˜ & ˆ | + << >>
是唯一合法的运算符)。这意味着,没有循环,if-then
或任何类似的东西。可以使用常量。
到目前为止,我所拥有的都行不通,但是我认为我应该将整数16
,8
和4
时间的位移位,而将剩余的整数XOR
移位。
谁能提供一些建议?谢谢。
最佳答案
这可以通过循环正确解决。但是,这是没有它的一种方法。
x = (x & 0x0000FFFF) ^ (x >> 16)
x = (x & 0x000000FF) ^ (x >> 8)
x = (x & 0x0000000F) ^ (x >> 4)
x = (x & 0x00000003) ^ (x >> 2)
x = (x & 0x00000001) ^ (x >> 1)
编辑:我不需要&。更好的版本:
x ^= x >> 16
x ^= x >> 8
x ^= x >> 4
x ^= x >> 2
x ^= x >> 1
x &= 1;