示例代码,下面中的">>>"是什么意思呢:
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
在这里。
>>
和之间的差异>>>
只会在移动负数时出现。如果它是 a ,则>>
运算符将一位1
移入最高有效位,并且无论如何都移入a 。1
>>>
0
更新:
让我们平均1
和2147483647
( 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.
让我们“转变”为>>>
:
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.