为什么两个 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;
}

http://ideone.com/B33YB

最佳答案

由于operator precedence
+的执行要早于>>

当你改变
(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;
}

参见http://ideone.com/d3mHT

关于c - 位移的奇怪行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11139239/

10-15 12:05