8

(x + y)/2Java で任意の 2 つの整数 x、yを計算する方法が欲しいです。x+y > Integer.MAX_VALUE、または < Integer.MIN_VALUE の場合、単純な方法では問題が発生します。

グアバIntMath 次の手法を使用します。

  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} (-1 ではなく -2 を与える) のような単純な値の方法と一致しません。

0 に向かって切り捨てられる対応するルーチンはありますか?

長い入力でも機能するメソッドが必要なため、 「ただ使用するlong」は私が探している答えではありません。BigInteger私が探している答えでもありません。ブランチを使用したソリューションは必要ありません。

4

2 に答える 2

2

最下位ビットが異なる場合 (結果が正確でなく、丸める必要がある場合) に結果に追加する必要があり1、結果の符号ビットが設定されている (結果が負であるため、切り捨てを変更する必要がある)ラウンドアップに)。

したがって、次のようにする必要があります(テストされていません):

public static int mean(int x, int y) {
    int xor = x ^ y;
    int roundedDown = (x & y) + (xor >> 1);
    return roundedDown + (1 & xor & (roundedDown >>> 31));
}
于 2013-04-20T16:02:02.007 に答える
0

(x-y)/2 + yに還元されるのようなことをしてみませんx/2 - y/2 + y = x/2 + y/2か? したがってx+y、オーバーフローまたはアンダーフローが発生した場合は、そのようにし(x-y)/2 + yます。

于 2013-04-20T01:21:53.590 に答える