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
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<<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.
Wartość Ilość przesunięcie służy modulo 32. Więc Drugim przykładem jest właściwie taka sama jak przesuwanie przez 0.
także http://stackoverflow.com/q/34193787/1743880 i http: // stackoverflow.com/q/3170412/1743880 – Tunaki
@Tunaki: Tak, jest podobny. – nenito