2009-12-29 3 views
5

Если сдвинутое число положительно >>> и >> работают одинаково.Разница между >>> и >> операторами

Если сдвинуты число отрицательное >>> заполняет наиболее значимые биты с 1 сек, тогда как >> операции сдвигов, заполняющих MSB, с 0.

мое понимание правильно?

Если отрицательные числа хранятся с MSB, установленным в 1, а не с дополнением 2s, которое использует Java, операторы будут вести себя совершенно по-другому, правильно?

+0

Возможные дубликаты: [Разница между >>> и >>] (http://stackoverflow.com/q/2811319/1529630), [Java >> против >>> Operator?] (http://stackoverflow.com/q/1034640/1529630) – Oriol

ответ

8

То, как представлены отрицательные числа, называется дополнением 2. Чтобы продемонстрировать, как это работает, возьмите -12 в качестве примера. 12, в двоичном формате - 00001100 (предположим, что целые числа - 8 бит, хотя на самом деле они намного больше). Возьмите дополнение 2, просто инвертируя каждый бит, и вы получите 11110011. Затем просто добавьте 1, чтобы получить 11110100. Обратите внимание, что если вы снова примените те же шаги, вы получите положительные 12 назад.

>>> сдвиги в ноль, независимо от того, что 12 >>> 1 должно дать вам 00000110, что равно 6, и (-12) >>> 1 должен дать вам 01111010, то есть 122. Если вы на самом деле попробуйте это на Java, вы получите гораздо большее число, так как Java ints на самом деле намного больше 8 бит.

>> Сдвиги немного идентичны наивысшему биту, поэтому положительные числа остаются положительными, а отрицательные - отрицательными. 12 >> 1 - 00000110 (еще 6) и (-12) >> 1 будет 11111010, что отрицательно 6.

1

Как раз наоборот, то >>> заполняет нулями, а >> заполняет те, если хо бит равен 1.

+0

Можете ли вы объяснить, почему '7 >>> 32 = 7'. Я слышал о круговых смещениях, но я думал, что применим только к '>>'. Не будет ли '7 >>> 32' после 32 смены, равных нулю? –

+0

@IanLimarta: Если левая сторона - это int, сумма сдвига уменьшается до 32-го. В вашем случае это означает, что значение сдвига равно 0, что фактически не работает. См. [JLS] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.19) –

2

Definition of the >>> operator in the Java Language Specification:

Значение n>>>s является п правый смещенной s бит с нулевым расширением. Если n положительно, то результат будет таким же, как и у n>>s; если n отрицательно, результат равен значению выражения (n>>s)+(2<<~s), если тип левого операнда int и результат выражения (n>>s)+(2L<<~s), если тип левого операнда long.

Смежные вопросы