两个整数的平均值

求两个整数a,b的均值时,经常写的就是(a+b)/2

然而此种写法有一个问题就是 a+b 的值可能溢出,如何解决这个问题呢?

方法1:

对 a 和 b 做判断,若 a 和 b 同为奇数,则给 a/2 + b/2 加 1,否则不加

avg = a/2 + b/2 + ((a&1 && b&1)?(1:0))

方法2:

avg = a & b + (a ^ b)>>2

解释如下:

另 a = w + x , b = w +y ,其中 w = a & b ,

则 w 为 a 和 b 的所有二进制位相同的那些位所表示的数,因而,x 和 y 的二进制表示上的个个位都不同,因此 x + y = (a ^ b),

而 avg =(w + x + w + y)/2 = w + (x + y)/2 = (a & b) + ((a ^ b)>>2)

如 a = 13, b = 11,则 a 的二进制表示为 1101,b 的二进制表示为1011,则 w = a&b = 9,x = a - w = 4 = 100B, y = 2 = 10B

则 avg = 9 + 3 = 12

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值