我想要一種方法來計算(x + y)/2
任何兩個整數x,y在Java中。如果x + y> Integer.MAX_VALUE或< Integer.MIN_VALUE,那麼天真的方式會遇到問題。平均兩個整數(或長)沒有溢出,截斷爲0
番石榴IntMath
uses這種技術:
public static int mean(int x, int y) {
// Efficient method for computing the arithmetic mean.
// The alternative (x + y)/2 fails for large values.
// The alternative (x + y) >>> 1 fails for negative values.
return (x & y) + ((x^y) >> 1);
}
...但是這輪向負無窮,這意味着常規不與天真的方式達成一致值如{-1,-2}(給-2,而不是-1)。
是否有任何相應的程序截斷爲0?
「只是使用long
」不是我正在尋找的答案,因爲我想要一個適用於長輸入的方法。 BigInteger
也不是我要找的答案。我不想要任何分支機構的解決方案。
*「我不想與任何分支機構的解決方案。」 * - 甚至,如果最好的網點解決方案比設有分支機構的最佳解決方案慢? – 2013-04-20 01:23:30
以下是C++的解決方案:http://stackoverflow.com/a/3816473/139985。它也應該適用於Java。 – 2013-04-20 01:34:43
你說得對 - 如果分支機構的解決方案比隨機輸入的分支機構性能更好,我很樂意使用它。我想我顯示了我的偏見 - 我懷疑這樣的解決方案存在:) – BeeOnRope 2013-04-20 01:35:53