与、或、异或运算

原文:http://blog.csdn.net/abc785442154abc/article/details/48086601

[cpp]  view plain  copy
  1. int a=729;  
  2. int b=271;  
  3. printf("%d \n",(a & b) +(a ^ b)>>1);  
  4. 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)好啦,掌握了&(与运算)、|(或运算)、^(异或运算)的本质,以后涉及这类题便可瞬间秒杀


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值