Ответ 1
-1<<32
эквивалентен -1<<0
, т.е. нет-op. Причина в том, что расстояние сдвига (32)
равно AND с помощью 0x1f
и 32 & 0x1f
равно 0.
Это определено в JLS # 15.19 (выделено мной):
Если продвинутым типом левого операнда является int, тогда только пять младших бит правого операнда используются как расстояние сдвига. Это как если бы правый операнд подвергался поразрядному логическому оператору И и (§15.22.1) с значением маски 0x1f (0b11111). Поэтому фактически используемое расстояние сдвига всегда находится в диапазоне от 0 до 31 включительно.