示例代码,下面中的">>>"是什么意思呢:
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.
