2016-03-30 4 views
13

Может кто-то объяснить, почему следующие битовые выражения не возвращать разные результаты:оператор побитового Java <<

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

Также http://stackoverflow.com/q/34193787/1743880 и HTTP: // stackoverflow.com/q/3170412/1743880 – Tunaki

+0

@ Тунаки: Да, это похоже. – nenito

ответ

14

-1<<32 эквивалентно -1<<0, т.е. не-оп. Причина заключается в том, что изменение расстояния (32) является И-эд с 0x1f и 32 & 0x1f 0.

Это определяется в JLS #15.19 (курсив мой):

Если расширенный тип левого операнда is int, тогда только пять младших разрядов правого операнда используются как расстояние сдвига. Это как если бы правый операнд был подвергнут поразрядному логическому оператору И & (§15.22.1) с значением маски 0x1f (0b11111). Поэтому фактически используемое расстояние сдвига всегда находится в диапазоне от 0 до 31 включительно.

3

Значение счетчика сдвига используется по модулю 32. Таким образом, второй пример фактически такой же, как переход от 0.