Битовые операции в JavaScript - PullRequest
4 голосов
/ 19 февраля 2020

Я знаю, что числа в JavaScript хранятся в формате IEEE-754. Но когда мы используем целые числа, особенно побитовые операторы, они представляются как двоичное дополнение с 32 битами.

Так что -1 будет 0xFFFFFFFF. Но (-1).toString(2) - это -1. И -1 >>> 31 равно 1, это верно, но -1 >>> 32 должно быть 0, однако это 4294967295. И -1 << 32 должно быть 0, но это -1.

Почему побитовые операции работают таким образом? И toString() показывает число со знаком -, почему этот минус не находится в знаковом бите? Кроме того, почему -1 >> 0 равно -1, а -1 >>> 0 равно 4294967295? Я знаю, в чем разница между >> и >>>, но второй операнд - 0, поэтому я не могу понять, почему эти операции работают по-разному.

1 Ответ

3 голосов
/ 19 февраля 2020

Разница между >>> и >>

При арифметическом сдвиге c знаковый бит увеличивается для сохранения подписи числа.

-1 в 8 bit равно 11111111 -2 равно 11111110 ...

Это обрабатывается так, потому что, если вы посчитаете до максимально возможного числа +1, будет показано минимально возможное число (8 bit: 01111111 +1 = 10000000), поэтому 111111111 равно -1

Логическое смещение вправо, однако, не заботится о том, чтобы значение могло представлять число со знаком; он просто перемещает все вправо и заполняет слева нулями.

, так что здесь, -1 >>> толкает 11111111 один вправо, так что знак "-" теряется и показано наибольшее положительное число 01111118 bit)

Также причина, по которой -1 >> 0 равно -1, заключается в том, что 11111111 >> 0 буквально ничего не добавляет, а -1 >>> 0 еще перемещает все и заполняет левые биты 0, каждый шаг, который вы увеличиваете это «0», будет вдвое меньше значения до 0. Вы можете попробовать -1 >>> 31, чтобы увидеть, что он получает 1

...