Java求两个数平均值

  如何正确的求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     }

猜你喜欢

转载自www.cnblogs.com/zsh-blogs/p/10386961.html