int a=729;
int b=271;
printf("%d \n",(a & b) +(a ^ b)>>1);
printf("%d \n",(a & b) +(a | b));
输出结果:500;1000
(1)这道题咋看上去是位运算,一步一步进行位运算,不会吧,很low的。那么有什么捷径呢?
(2)好的,我们来读懂这道题的含义。先来说说各种位运算的本质吧。
&运算:相当于十进制 相同位做加法的1/2
0101 & 0011 结果:二进制0001 十进制 (2^0 +2^0)/2 这里的"^"代表次幂
|运算:相当于十进制 相同位做加法的1/2与不同位做加法求和
0101 | 0011 结果:二进制0111 十进制 (2^0 +2^0)/2 +(2^2 +2^1)
^运算:相当于十进制不同位做加法
0101 ^ 0011 结果:二进制0110 十进制(2^2 + 2^1 )
(3)好了,我们用(2)所示的方法再来求解这道题试试
第一个输出结果的含义:729、271相同位做加法的1/2 与 729、271不同位做加法的1/2(右移1位相当于除2)求和,哎呀,这个含义不就是729与271求平均数吗,OK,结果就是500。
第二个输出结果的含义:729、271相同位做加法的1/2,729、271相同位做加法的1/2,729、271不同位做加法求和,三个结果的和,哎呀呀,这个含义不就是729与271求和吗,OK结果就是1000啦。
(4)好啦,掌握了&(与运算)、|(或运算)、^(异或运算)的本质,以后涉及这类题便可瞬间秒杀
原文:https://blog.csdn.net/abc785442154abc/article/details/48086601