一、我们一般都会想到求两个平均值是(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