求两个数的平均时遇到的坑,相加除以2会有bug
求两个数的平均时遇到的坑,相加除以2会有 bug,
int mid = (low + high) / 2;
即上面的代码是有bug的,如果low和high的和大于 Integer.MAX_VALUE(在Java中是 231 -1),计算就会发生溢出,使它成为一个负数,然后被 2 除时结果当然仍是负数。
纠正无bug版
所有情况都通用
int mid = low + ((high - low) / 2);
另一个骚操作
Java有一个 >>>
无符号右移,可以实现求平均
int mid1 = (high+low)>>>1;
注意:仅能计算和是正数的,因为你的和是负数,按理说平均值也是负数,但是无符号右移是直接在左边补0,你的符号位都没了,肯定就计算不对了
Java的测试代码
public class Main
{
public static void main(String[] args) {
System.out.println("Hello World");
int low,high,mid;
low = -1234;
high = 3456;
mid = low+(high-low)/2;
System.out.println(mid);
int mid1 = (high+low)>>>1;
System.out.println(mid1);
}
}
输出
Hello World
1111
1111
可以自己测试,只要两者的和是正数,无符号右移的结果都是正确的(哪怕和溢出都是正确的),负数就出错,
和溢出情况代码
public class Main
{
public static void main(String[] args) {
System.out.println("Hello World");
int low,high,mid;
low = 2147483645;
high = 2147483647;
mid = low+(high-low)/2;
System.out.println(mid);
int mid1 = (high+low)>>>1;
System.out.println(mid1);
}
}
输出
Hello World
2147483646
2147483646