Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Битовый сдвиг (https://javascript.ru/forum/misc/85622-bitovyjj-sdvig.html)

firep91613 17.11.2023 22:26

Битовый сдвиг
 
Пример из учебника:
alert(10000000000 << 1); // -1474836480, отброшен крайний-левый бит
Как здесь получается -1474836480?

10000000000 - не вмещается в 32 бита (макс. 2147483647). Значит будет отброшен крайний левый бит. Или три крайних левых? Из (10000000000).toString(2) // '1001010100000010111110010000000000' станет '001010100000010111110010000000000'. Теперь число 1410065408 вмещается в 32 бита. Применяется к нему левый сдвиг, т.е. из '001010100000010111110010000000000' станет '010101000000101111100100000000000' - в десятичной 2820130816. Оно снова не влазит в 32 бита. Что проcиходит дальше? Я так понял это: ~(~parseInt('010101000000101111100100000000000', 2) + 1) // -1474836481. Из-за переполнения переходит просто в отрицательное?

voraa 17.11.2023 23:35

Цитата:

Сообщение от firep91613
Из (10000000000).toString(2) // '1001010100000010111110010000000000'

Это 34 бита.
Отбрасываем 2 левых, справа дописываем 00
(10)01010100000010111110010000000000 00
Итого 0101010000001011111001000000000000
Сдвигаем на 1 бит влево
(0) 101010000001011111001000000000000 0
Итого
1010100000010111110010000000000000
Старший разряд 1 (знак -) значит модуль (как вы правильно пишете)
~parseInt('010101000000101111100100000000000', 2) + 1 = 1474836480
Значит результат -1474836480

firep91613 18.11.2023 13:30

voraa,
благодарю за содержательный ответ.


Часовой пояс GMT +3, время: 08:12.