什么“>>>”在java中意味着什么?
我发现此代码在SOpost中找到重复项。 但是我不明白这行是什么意思int mid = (low + high) >>> 1;
private static int findDuplicate(int[] array) { int low = 0; int high = array.length - 1; while (low >> 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
。
更新:
设平均为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.
的意义
int mid = (low + high) >>> 1;
是; 通过使用无符号移位,它避免了导致负数的溢出。 这是必需的,因为Java不支持unsigned int
值。 (BTW char
未签名)
写这个的传统方式是
int mid = (low + high) / 2; // don't do this
然而,这可能会溢出更大的金额,你得到一个负数中期。
例如
int high = 2100000000; int low = 2000000000; System.out.println("mid using >>> 1 = " + ((low + high) >>> 1)); System.out.println("mid using / 2 = " + ((low + high) / 2));
版画
mid using >>> 1 = 2050000000 mid using / 2 = -97483648
显然第二个结果是不正确的。
它是一个按位运算符..它适用于位值。 假设如果A持有60则A >>> 2将给出15(位值0000 1111)
它的实际名称是“Shift Zero right Operator”,左操作数值右移操作数指定的位数(在本例中为2),移位值用零填充(0000)。