Разница между >>> и >>
При арифметическом сдвиге c знаковый бит увеличивается для сохранения подписи числа.
-1
в 8 bit
равно 11111111
-2
равно 11111110
...
Это обрабатывается так, потому что, если вы посчитаете до максимально возможного числа +1, будет показано минимально возможное число (8 bit: 01111111 +1 = 10000000
), поэтому 111111111
равно -1
Логическое смещение вправо, однако, не заботится о том, чтобы значение могло представлять число со знаком; он просто перемещает все вправо и заполняет слева нулями.
, так что здесь, -1 >>>
толкает 11111111
один вправо, так что знак "-" теряется и показано наибольшее положительное число 0111111
(в 8 bit
)
Также причина, по которой -1 >> 0 равно -1, заключается в том, что 11111111 >> 0 буквально ничего не добавляет, а -1 >>> 0 еще перемещает все и заполняет левые биты 0, каждый шаг, который вы увеличиваете это «0», будет вдвое меньше значения до 0. Вы можете попробовать -1 >>> 31, чтобы увидеть, что он получает 1