我想知道第1位的数字是奇数还是偶数。 这是代码:
int odd_ones(unsigned x)
{
x ^= x >> 16;
x ^= x >> 8;
x ^= x >> 4;
x ^= x >> 2;
x ^= x >> 1;
return !(x&1);
}
但我不知道它是如何运作的;我已经坚持了很长时间。
答案 0 :(得分:6)
尝试证明在执行x ^= x >> 16;
之后x
的最后16位将具有与原始值1
相同的x
s奇偶校验(假设x为32)位)。然后在执行x ^= x >> 8;
之后,x的最后 8 位将具有与{<1}} - s相同的奇偶校验,而x 的最后16位之前操作。通常,当您执行1
时,结果的最后x ^= x >> L
位将具有与L
s的奇偶校验1
s相同的余地1
x的原始值的位。
答案 1 :(得分:0)
以下是 8位奇偶校验发生器的电路图。
您的代码尝试将此组合电路实现为顺序逻辑(对于32位)。
想象这个电路的工作将有助于你理解代码。
上述电路的等效代码即8位将是:
int odd_ones(unsigned x)
{
x ^= x >> 1;
x ^= x >> 2;
x ^= x >> 4;
return !(x&1);
}