Отрицательный логический сдвиг - PullRequest
2 голосов
/ 20 апреля 2010

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

Разве >>> -1 не совпадает с << 1? Но -32 << 1 = -64. <br> Я прочитал два дополнения, но все еще не понимаю аргументацию.

Ответы [ 2 ]

6 голосов
/ 20 апреля 2010

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

1 голос
/ 20 апреля 2010

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

Для 32-разрядных int i,

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

Для 64-битных long num,

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

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

Смотри также

...