求兩個數的平均時遇到的坑,相加除以2會有bug
阿新 • • 發佈:2021-06-11
求兩個數的平均時遇到的坑,相加除以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