2016-03-30 25 views
13

Może ktoś wyjaśnić, dlaczego następujące wyrażenia bitowe zwracać różne wyniki:operatory bitowe Java <<

System.out.println((-1<<31)<<1); // it prints 0 
System.out.println(-1<<32);  // it prints -1 
+1

także http://stackoverflow.com/q/34193787/1743880 i http: // stackoverflow.com/q/3170412/1743880 – Tunaki

+0

@Tunaki: Tak, jest podobny. – nenito

Odpowiedz

14

-1<<32 jest równoważna -1<<0, czyli nie-op. Powodem jest to, że odległość jest przesunięcie (32) I-ed z 0x1f i 32 & 0x1f 0.

ta jest zdefiniowana w kopalni JLS #15.19 (nacisk):

Jeśli promowane typ operandu lewostronnego is int, then tylko pięć najniższych rzędów prawego operandu są używane jako odległość przesunięcia. To tak, jakby prawy operand był poddany bitowemu logicznemu operatorowi AND & (§15.22.1) z wartością maski 0x1f (0b11111). Właściwa długość przesunięcia jest zatem zawsze w zakresie od 0 do 31 włącznie.

3

Wartość Ilość przesunięcie służy modulo 32. Więc Drugim przykładem jest właściwie taka sama jak przesuwanie przez 0.