求两个整型平均数,简单吧!简单吗?
入门级:加、除
简单!
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; }
可以看到,虽然计算公式变复杂了,但是健壮性得到了质的提升!
时间: 2024-11-05 17:23:17