Java求两个数平均值

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

引用:https://www.cnblogs.com/zsh-blogs/p/10386961.html
引用:https://blog.csdn.net/IT_arookie/article/details/83218550

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容