首页 > 代码库 > 求两个整型数的平均数

求两个整型数的平均数

求两个整型平均数,简单吧!简单吗?

入门级:加、除

简单!

int getAverage(int input1, int input2) {

    int average = (input1 + input2) / 2;

    return average;

}

这样一个求平均数的方法拿去做大学编程题基本够用了,但是,还不够美!

进阶级:加、位

我们知道,2的指数级的乘、除运算,实质是在做移位运算,所以我们可以试着把除2变成右移1位,于是有:

int getAverage(int input1, int input2) {

    int average = (input1 + input2) >> 1;

    return average;

}

用上位操作瞬间就感觉逼格高了有没有,哈哈,不过别高兴的太早,这个方法处理“正常” 的int数没有问题,但当input1+input2的值溢出时(<Integer.MIN_VALUE or >Integer.MAX_VALUE),就处理不了了,但是如果我们能确定input始终不为负(比如数组下标),我们可以用无符号右移(>>>)代替有符号右移(>>),而且这样可以避免掉input之和溢出的问题,因为无符号右移只会在左侧空位补0。综上所述,当确定input必为非负时,我们有如下比较强壮的实现:

int getAverage(int input1, int input2) {

    int average = (input1 + input2) >>> 1;

    return average;

}

高级:位、加

讲到这里你可能会问,难道没有一种完美的方法解决上面说的input和为负数或溢出的问题吗?答案是,有!请看:

int getAverage(int input1, int input2) {

    int average = (input1 & input2) + ((input1 ^ input2) >> 1);

    return average;

}

可以看到,虽然计算公式变复杂了,但是健壮性得到了质的提升!

求两个整型数的平均数