如何正确的求2个数的平均值。在练习算法二分查找的时候发现的,以前没有注意到的bug
备注:数据以int类型为例
一、以前的通用写法
1 /** 2 * 求a+b平均值 3 * @param a 4 * @param b 5 * @return a+b的平均值 6 */ 7 static int avg(int a ,int b){ 8 return (a+b)/2; 9 }
请记住:这是一个有bug的写法,因为两个数相加有可能超过了int的范围,但是他们的平均值肯定不会超过范围。以前没有注意到这个问题,知道深入了解了位运算。
二、正确写法
1 /** 2 * 求a+b平均值 3 * @param a 4 * @param b 5 * @return a+b的平均值 6 */ 7 static int avg(int a ,int b){ 8 double random = Math.random(); 9 if (random >= 0 && random <= 0.25){ 10 //正确写法1 11 return ((a&b) + ((a^b) >> 1)); 12 }else if (random > 0.25 && random <= 0.5){ 13 //正确写法2 14 return b+(a-b)/2; 15 }else if (random > 0.5 && random <= 0.75){ 16 //正确写法3 17 return b+((a-b)>>1); 18 }else if (random > 0.75 && random <= 1.0){ 19 //正确写法4 20 return (a+b)>>>1; 21 }else { 22 return -1; 23 } 24 }