2
为什么两个语句输出不同的值?移位的奇怪行为
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;
}
为什么两个语句输出不同的值?移位的奇怪行为
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;
}
+
早于>>
执行。
当您更改
(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;
}
如果第二行规定:((N 0xAAAAAAAA)>> 1)+ N&0x55555555,那么就应该输出5代替10.但是,它显示了10. –
@ 0A0D我写完了我的答案(我认为),我注意到我们正在改变对方的修改......(以及我改变了你的)谢谢你帮忙帮忙,这不是故意的。 – Veger
@algogeek因为'+'操作优先于'&'你需要更多的括号。 – Veger