1. ホーム
  2. java

[解決済み] javaで">>>"はどういう意味ですか?[重複しています]

2022-03-01 18:32:01

質問

での重複を見つけるために、こんなコードを見つけました。 SO の投稿はこちらです。 が、この行の意味がわかりません。 int mid = (low + high) >>> 1;

private static int findDuplicate(int[] array) {
        int low = 0;
        int high = array.length - 1;

        while (low <= high) {
            int mid = (low + high) >>> 1;
            System.out.println(mid);
            int midVal = array[mid];

            if (midVal == mid)
                low = mid + 1;
            else
                high = mid - 1;
        }
        return high;
    }

解決方法は?

その >>> 演算子は Javaにおける符号なし右ビットシフト演算子 . これは事実上、オペランドを 2 を右オペランドのべき乗にしたもの、あるいは単に 2 ここで

との違いは >>>>> は、負の数をシフトするときだけ表示されます。 その >> 演算子は 1 であった場合は、最上位ビットに変換されます。 1 と、その >>> でシフトします。 0 を問わず。

UPDATEです。

平均化しよう 12147483647 ( Integer.MAX_VALUE ). 簡単に計算ができます。

(1 + 2147483647) / 2 = 2147483648 / 2 = 1073741824

さて、このコードで (low + high) / 2 があり、これが関係するビットです。

          1: 00000000 00000000 00000000 00000001
+2147483647: 01111111 11111111 11111111 11111111
================================================
-2147483648: 10000000 00000000 00000000 00000000  // Overflow
/2
================================================
-1073741824: 11000000 00000000 00000000 00000000  // Signed divide, same as >> 1.

に"shift"をしてみましょう。 >>> :

          1: 00000000 00000000 00000000 00000001
+2147483647: 01111111 11111111 11111111 11111111
================================================
-2147483648: 10000000 00000000 00000000 00000000  // Overflow
>>> 1
================================================
+1073741824: 01000000 00000000 00000000 00000000  // Unsigned shift right.