Способ представления отрицательных чисел называется дополнением 2. Чтобы продемонстрировать, как это работает, возьмем в качестве примера -12. 12, в двоичном виде, равно 00001100 (предположим, что целые числа - это 8 бит, хотя в реальности они намного больше). Возьмем дополнение 2, просто инвертируя каждый бит, и получим 11110011. Затем просто добавьте 1, чтобы получить 11110100. Заметьте, что если вы повторите те же самые шаги, то получите обратно положительный результат 12.
The >>> сдвигается в нуль несмотря ни на что, поэтому 12 >>> 1 должно дать вам 00000110, то есть 6, а (-12) >>> 1 должно дать вам 01111010, то есть 122. Если вы действительно попробуете это в Java, вы получите гораздо большее число, так как Java-инты на самом деле намного больше 8 бит.
The >> сдвигается в бит, идентичный самому большому биту, так что положительные числа остаются положительными, а отрицательные - отрицательными. 12 >> 1 - это 00000110 (все еще 6) и (-12). >> 1 будет 11111010, что отрицательно 6.
Определение оператора >>>
в спецификации языка Java:
Значение
n>>s
- это n правосдвинутых битовых позиций s с нулевым расширением. Если n положительное, то результат будет таким же, как и вn>>s
; если n отрицательное, то результат равен результату выражения(n>>s)+(2<<~s)
, если тип левого операндовint
, и результату выражения(n>>s)+(2L<<<~s
), если тип левого операндовlong
.
Напротив, >>> заполняется нулями, а >> - единицами, если бит h.o. равен 1.
.