位操作(一)

int hjdfunc(int nX, int nY)

{

    return(nX&nY+((nX^nY)>>1)));

}

问:hjdfunc(50, 70)返回多少?

不能用笨办法,把50、70转成2进制。

(nX+nY)/2,可以考虑成:

(1)两个2进制数先把都是‘1’的位相加再除以2;

(2)把不同的位上相加,即‘0’对应‘1’,然后再除以2;

(3)前两部分相加,得到结果。

nX&nY,实际上是把50、70的2进制形式里,相同的‘1’加起来后除以2,因为两个'1'变成了1个’1‘。例如:0100 & 1100,得到0100,其中第3位2个‘1’得到1一个‘1’。

nX^nY,按位异或,即把两个2进制数,按位不相同的部分相加了,再右移一位,相当于除以2。

综合起来,两部分加就是(nX+nY)/2。好处是不会溢出。例如两个整数相加,尽管平均值不超界,但是先求和,有可能超界。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值