您的位置:首页 > 其它

与、或、异或运算

2018-01-09 17:36 190 查看
原文:http://blog.csdn.net/abc785442154abc/article/details/48086601

[cpp] view
plain copy

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)好啦,掌握了&(与运算)、|(或运算)、^(异或运算)的本质,以后涉及这类题便可瞬间秒杀
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: