什么“>>>”在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

更新:

设平均为12147483647Integer.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)。