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

Tha*_*Bao 0 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);
}
Run Code Online (Sandbox Code Playgroud)

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

izo*_*ica 6

尝试证明在执行x ^= x >> 16;最后16位之后x将具有与1原始值相同的s 奇偶校验x(假设x为32位).然后,在执行x x ^= x >> 8;的最后8位之后,将具有与操作之前1x的最后16位相同的-s 奇偶校验.通常,当你这样做时,结果的最后几位将具有与x的原始值的最后位中的s的奇偶校验相同的奇偶校验.x ^= x >> LL112*L