2012-06-21 91 views

回答

14

由于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

+0

如果第二行规定:((N 0xAAAAAAAA)>> 1)+ N&0x55555555,那么就应该输出5代替10.但是,它显示了10. –

+0

@ 0A0D我写完了我的答案(我认为),我注意到我们正在改变对方的修改......(以及我改变了你的)谢谢你帮忙帮忙,这不是故意的。 – Veger

+0

@algogeek因为'+'操作优先于'&'你需要更多的括号。 – Veger