wat betekent “>>>” in java bedoelen?

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 2tot de macht van de juiste operand, of gewoon 2hier.

Het verschil tussen >>en >>>zou alleen verschijnen bij het verschuiven van negatieve getallen. De operator >>verschuift een 1bit naar het meest significante bit als het een 1was, en de >>>verschuift hoe dan ook in een 0.

UPDATE:

Laten we het gemiddelde nemen van 1en 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 charis 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).

Other episodes