求两个整数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