Ik heb deze code gevonden om duplicaten te vinden in SOpost hier.
maar ik begrijp niet wat deze regel betekent 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;
}
Antwoord 1, autoriteit 100%
De operator >>>
is de niet-ondertekende rechter bit-shift operator in Java. Het verdeelt de operand effectief door 2
tot de macht van de juiste operand, of gewoon 2
hier.
Het verschil tussen >>
en >>>
zou alleen verschijnen bij het verschuiven van negatieve getallen. De operator >>
verschuift een 1
bit naar het meest significante bit als het een 1
was, en de >>>
verschuift hoe dan ook in een 0
.
UPDATE:
Laten we het gemiddelde nemen van 1
en 2147483647
(Integer.MAX_VALUE
). We kunnen de wiskunde gemakkelijk doen:
(1 + 2147483647) / 2 = 2147483648 / 2 = 1073741824
Nu, met de code (low + high) / 2
, zijn dit de betrokken bits:
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.
Laten we de “shift” maken naar >>>
:
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.
Antwoord 2, autoriteit 46%
De betekenis van
int mid = (low + high) >>> 1;
is; door de niet-ondertekende ploeg te gebruiken, vermijdt het overlopen die resulteren in een negatief getal. Dit is nodig omdat Java geen unsigned int
-waarden ondersteunt. (BTW char
is niet ondertekend)
De traditionele manier om dit te schrijven was
int mid = (low + high) / 2; // don't do this
dit kan echter overlopen voor grotere bedragen en u krijgt een negatief getal voor het midden.
bijv.
int high = 2100000000;
int low = 2000000000;
System.out.println("mid using >>> 1 = " + ((low + high) >>> 1));
System.out.println("mid using / 2 = " + ((low + high) / 2));
afdrukken
mid using >>> 1 = 2050000000
mid using / 2 = -97483648
het tweede resultaat is duidelijk onjuist.
Antwoord 3, autoriteit 5%
het is een bitsgewijze operator .. Het werkt op de bitwaarde .
Stel dat als A 60 bevat, dan geeft A>>>2 15 (bitwaarde 0000 1111)
De echte naam is “Shift Zero right Operator”
hier wordt de linkeroperandwaarde naar rechts verplaatst met het aantal gespecificeerde bits (2 in dit geval) door de rechteroperand en verschoven waarden worden opgevuld met nullen (0000).