(x&y) + ((x^y)>>1) 作用及其优点

(x&y) + ((x^y)>>1)作用及其优点

作用

《程序员面试宝典》第四版39页的题:

int func(int x, int y) {

return (x & y) + ((x ^ y) >> 1);

}

func(729,271)是多少?思路最简单也最直接的就是将x和y都先转换为二进制,然后老老实实的做按位与,按位异或等运算,最后得出结果。

首先说明该表达式的作用就是求两数的平均值,也就是说func(729,271)= (729+271)/2=500。下面说明该表达式的思路。对于二进制的位运算(&、|、^、~),某位的运算无非就是三种情况:(1)1与1运算;(2)1与0运算;(3)0与0运算。

1与0运算:1&0结果为0,1^0结果为1,那么只考虑^运算,该位就是1。而0^1可看成(0+1) =1。

1与1运算:两个数的二进制运算中若某位上两个数均为1,则1&1为1,1^1的结果为0,那么只考虑&运算。而1&1可看成(01+01)>>1 =01(考虑进位)。当然可以看成是(1+1)/2=1,但是这时的1是十进制,不是二进制。

0与0运算:0&0为0,0^0为0,则均不用考虑,该位为0即可。

由上面分析可得,对(x & y)与((x ^ y) >> 1)的计算,可以把x和y对应的二进制每一位拆开来分别计算,那么可分成三类,每一类分别计算,最后相加。其中,一类是x,y对应位都是1,用x&y计算;一类是x,y中对应位有且只有一位是1,用(x^y)>>1计算;还有一另是x,y中对应位均为0,无须计算,因此这一类可以忽略,也就是说实际只需考虑前两类即可。

举例子来说:5和13对应的二进制分别为0101和1101,把对应的二进制数拆开来看:5=0000+0100+0000+0001,13=1000+0100+0000+0001,那么

 

 

5&13=

0000

 

 

+

0100

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值