Подтвердить что ты не робот

Unsigned right Shift '>>>' Оператор в Java

Возможный дубликат:
Почему (-1 → 32) = -1?

Беззнаковый оператор сдвига вправо вставляет в крайнее левое значение 0. Поэтому, когда я делаю

System.out.println(Integer.toBinaryString(-1>>>30))

Выход

11

Следовательно, он вставляет 0 в самый левый бит.

System.out.println(Integer.toBinaryString(-1>>>32))

Выход

11111111111111111111111111111111

Не должно быть 0?

4b9b3361

Ответ 1

См. http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.19

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

то есть -1 >>> 32 эквивалентно -1 >>> 0, а -1 >>> 33 эквивалентно -1 >>> 1 и, особенно запутанный, -1 >>> -1 эквивалентен -1 >>> 31