求两个数的平均值

一、我们一般都会想到求两个平均值是(a+b)/ 2,可是当a和b是两个非常大的整数,显然会超过int的最大范围,所以这种方式不合理。

二、为了解决第二种情况我们可以这样写a+(a - b)/2,这样就可以避免两个数之和越界了

三、还有一种求平均值的方式是

a & b + ((a^b)>>1)

解释:

a&b  这个表达式其实是求得两个数二进制bit位对应位相同的0或者1,当两个数的相同bit位置有相同的0或者1时,这个位置按位与结果还是0或者1,。正如两个数2和2求平均值结果还是2,所以a&b其实是求得相同bit位的平均值。


(a^b)>>1  第一个式子已经求了相同bit位置具有相同的0或者1的平均值,所以这个式子求的是相同bit位置具有不同的0和1的平均值。两个数异或其实就是两个数不进位的相加,然后再右移一位,相当于除2


总:求两个数的平均值实际拆分两步骤来求。下面请看一个实例

求6和8的平均值

6  ——  0110

8  ——  1000

第一步:两个数按位与得  0000  等价于 0

第二步:两个数  异或  等价于两个数不进位相加得到1110,在除2(右移一位)  得  0111  等价于 7

第三步:两个数相加  7

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_41318405

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值