1. 程式人生 > 其它 >求兩個數的平均時遇到的坑,相加除以2會有bug

求兩個數的平均時遇到的坑,相加除以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