如何正确的求 2 个数的平均值. 在练习算法二分查找的时候发现的, 以前没有注意到的 bug
备注: 数据以 int 类型为例
一, 以前的通用写法
- /**
- * 求 a+b 平均值
- * @param a
- * @param b
- * @return a+b 的平均值
- */
- static int avg(int a ,int b){
- return (a+b)/2;
- }
请记住: 这是一个有 bug 的写法, 因为两个数相加有可能超过了 int 的范围, 但是他们的平均值肯定不会超过范围. 以前没有注意到这个问题, 知道深入了解了位运算.
二, 正确写法
- /**
- * 求 a+b 平均值
- * @param a
- * @param b
- * @return a+b 的平均值
- */
- static int avg(int a ,int b){
- double random = Math.random();
- if (random>= 0 && random <= 0.25){
- // 正确写法 1
- return ((a&b) + ((a^b)>> 1));
- }else if (random> 0.25 && random <= 0.5){
- // 正确写法 2
- return b+(a-b)/2;
- }else if (random> 0.5 && random <= 0.75){
- // 正确写法 3
- return b+((a-b)>>1);
- }else if (random> 0.75 && random <= 1.0){
- // 正确写法 4
- return (a+b)>>>1;
- }else {
- return -1;
- }
- }
来源: http://www.bubuko.com/infodetail-2956182.html