Отрицательный логический сдвиг
В 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)
Эта маскировка операнда смещения также применяется к >>
и >>>
.
См. также