求两个数的平均时遇到的坑,相加除以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

posted on 2021-06-11 09:44  雾恋过往  阅读(233)  评论(0编辑  收藏  举报

Live2D