码迷,mamicode.com
首页 > 其他好文 > 详细

求两个整型数的平均数

时间:2016-10-27 15:13:37      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:简单   get   进阶   没有   计算公式   实现   学编程   移位   有符号   

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

入门级:加、除

简单!

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;

}

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

求两个整型数的平均数

标签:简单   get   进阶   没有   计算公式   实现   学编程   移位   有符号   

原文地址:http://www.cnblogs.com/duanzi6/p/6003990.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!