Operator >>>
jest unsigned right bit-shift operator in Java. Skutecznie dzieli operand przez 2
na moc prawego argumentu, lub tylko 2
tutaj.
Różnica między >>
a >>>
pojawiłaby się tylko przy przesuwaniu liczb ujemnych. Operator >>
przesuwa bit o numerze 1
na najbardziej znaczący bit, jeśli był to 1
, a >>>
przesuwa się w stanie 0
niezależnie.
UPDATE:
Chodźmy średnia 1
i 2147483647
(Integer.MAX_VALUE
). Możemy zrobić matematyki w prosty sposób:
(1 + 2147483647)/2 = 2147483648/2 = 1073741824
Teraz, wraz z kodem (low + high)/2
, są bity zaangażowane:
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.
Zróbmy "Shift" do >>>
:
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.
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html – iamnotmaynard