Разница между операторами >>> и >>

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

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

Правильно ли я понимаю?

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

Ответ 1

Представленные отрицательные числа называются 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.

Ответ 2

Определение оператора >>> в спецификации языка Java:

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

Ответ 3

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