求两个数的平均值

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

展开阅读全文

没有更多推荐了,返回首页