Отрицательный логический сдвиг

В Java, почему -32 → > -1 = 1?
Это не характерно только для -32. Он работает для всех отрицательных чисел, если они не слишком большие.
Я нашел, что x → > -1 = 1
x → > -2 = 3
x → > -3 = 7
x → > -4 = 15
если 0 > x > некоторое большое отрицательное число

Нет → > -1, то же самое, что < < 1? Но -32 < 1 = -64.
Я прочитал два дополнения, но до сих пор не понимаю рассуждений.

Ответ 1

Это потому что, когда вы перемещаете 32-разрядный int, он просто берет последние 5 бит расстояния сдвига. (т.е. мод 32), поэтому -1 mod 32 = 31, поэтому вы смещаете право на 31 бит. Когда вы смещаете отрицательное число (начальные бит которого составляют все 1 с), вы получаете 1. Аналогично, сдвиг вправо на -2 смещается на 30 бит и т.д. Если вы сдвинете a long, это будет принимать 6 бит расстояния сдвига. См. Здесь, где указано, как работают операторы смены: http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.19

Ответ 2

Java маскирует правый операнд на основе размера левого операнда.

Для 32-битного int i,

i << N   --> i << (N mod 32)

Для 64-битного long num,

num << N --> num << (N mod 64)

Эта маскировка операнда смещения также применяется к >> и >>>.

См. также