Битовый сдвиг
Пример из учебника:
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. Из-за переполнения переходит просто в отрицательное? |
Цитата:
Отбрасываем 2 левых, справа дописываем 00 (10)01010100000010111110010000000000 00 Итого 0101010000001011111001000000000000 Сдвигаем на 1 бит влево (0) 101010000001011111001000000000000 0 Итого 1010100000010111110010000000000000 Старший разряд 1 (знак -) значит модуль (как вы правильно пишете) ~parseInt('010101000000101111100100000000000', 2) + 1 = 1474836480 Значит результат -1474836480 |
voraa,
благодарю за содержательный ответ. |
Часовой пояс GMT +3, время: 08:12. |