位移的奇怪行为

Gre*_*lin 2 c bit-manipulation

为什么两个printf语句输出不同的值?

int main()
{
    int n=10;

    printf("%d\n",(n&0xAAAAAAAA)>>1 + n&0x55555555  ); //prints 0

    printf("%d\n", n&0x55555555 + (n&0xAAAAAAAA)>>1 ); //prints 10

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

http://ideone.com/B33YB

Veg*_*ger 14

由于运算符优先级.

+早于执行>>.

当你改变

(n&0xAAAAAAAA)>>1 + n&0x55555555)

n&0x55555555 + (n&0xAAAAAAAA)>>1)

您实际上正在更改执行操作的顺序.

(n&0xAAAAAAAA)>>1 + n&0x55555555可以重写为(n&0xAAAAAAAA)>>(1 + n&0x55555555)((n&0xAAAAAAAA)>>1) + n&0x55555555(与第二行所述的)不同的不同

对于+&操作员来说也是如此.

因此,要使输出的输出相似,您需要额外的括号:

int main()
{
    int n=10;

    printf("%d\n",((n&0xAAAAAAAA)>>1) + (n&0x55555555) ); // prints 5
    printf("%d\n",(n&0x55555555) + ((n&0xAAAAAAAA)>>1) ); // prints 5

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

http://ideone.com/d3mHT