奇偶校验如何找到偶数或奇数1的位?

时间:2014-12-14 08:27:52

标签: c bit-manipulation

我想知道第1位的数字是奇数还是偶数。 这是代码:

int odd_ones(unsigned x)
{

    x ^= x >> 16;
    x ^= x >> 8;
    x ^= x >> 4;
    x ^= x >> 2;
    x ^= x >> 1;
    return !(x&1);
}

但我不知道它是如何运作的;我已经坚持了很长时间。

2 个答案:

答案 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位)。
想象这个电路的工作将有助于你理解代码。

enter image description here

上述电路的等效代码即8位将是:

int odd_ones(unsigned x)
{
    x ^= x >> 1;
    x ^= x >> 2;
    x ^= x >> 4;
    return !(x&1);
}

图片礼貌Brigham Young University