我必须创建一个函数bitParity(int x)
,它接受一个整数,如果1
的位形式有奇数0
,则返回x
,和0
否则。
例如:bitParity(5) = 0, bitParity(7) = 1
但是,这很难,因为我只能在这个问题上使用位运算符(! ˜ & ˆ | + << >>
是唯一合法的)。这意味着,没有循环,if-then
或任何类型的东西。可以使用常量。
到目前为止,我所做的并不起作用,但我认为我应该将整数16
,8
和4
次的位移位{{1}其余的整数。
有人可以提供一些建议吗?感谢。
答案 0 :(得分:7)
对于32位数字:
function bitParity(int x) {
x ^= x >> 16;
x ^= x >> 8;
x ^= x >> 4;
x &= 0xf;
return (0x6996 >> x) & 1;
}
答案 1 :(得分:5)
通过循环正确解决了这个问题。但是这是一种没有它的方法。
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)
编辑:我不需要&amp ;.更好的版本:
x ^= x >> 16
x ^= x >> 8
x ^= x >> 4
x ^= x >> 2
x ^= x >> 1
x &= 1;
答案 2 :(得分:0)
这是我在学士论文工作期间使用的一项功能;)
/** Calculates number of bits in unsigned char
* @brief Bit count
* @param input to be checked
* @return int 0-8
*/
int bitCount( unsigned char input)
{
static unsigned char count[] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 };
return (int)(
count[ input & 0x0f] +
count[ (input >> 4) & 0x0f]
);
}
因此4B整数的总计数为:
int bytes = bitCount( (unsigned char)((number >> 0)&255))
+ bitCount( (unsigned char)((number >> 8)&255))
+ bitCount( (unsigned char)((number >> 16)&255))
+ bitCount( (unsigned char)((number >> 24)&255));
和平价:
return bytes%2;
return bytes&1; // if you preffer
我一直想重复使用这些代码:)
修改强>:
您可能已经注意到unsigned char
(8b)可以分成2个,每个4b长,这意味着16个值易于存储和重用。所以你从整数中取出第一个8b,将它们分成两部分。确保它们都处于区间<0,15>
,并且直接获得位数。重复:)