Page 121 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 121
программирования, таким как ассемблер или С1, или нет никакого представления
о том, как компьютер внутренне хранит числа, вам, возможно, захочется изучить
сначала эти темы (вы также можете пропустить или только просмотреть этот раз
дел, поскольку лишь в некоторых приложениях требуются побитовые операторы).
Побитовые операторы обрабатывают свои операнды как 32-разрядные целые числа
со знаком, представленные в двоичном дополнительном коде. Поскольку все числа
в JavaScript - с двойной точностью, JavaScript преобразует их в 32-разрядные целые
числа, прежде чем выполнять побитовые операторы, а затем преобразует их обратно
в числа двойной точности, прежде чем возвратить результат.
Побитовые операторы, подобно логическим операторам, выполняют логиче
ские операции (И, ИЛИ, НЕ, XOR), но с каждым отдельным битом целого числа. В
табл. 5.7 показано, что среди побитовых операторов есть также операторы сдвига,
позволяющие переместить все биты числа влево или вправо на нужно количество
разрядов.
Таблица 5 .7. Побитовые операторы
Оператор Описание Пример
& Побитовое AND О Ы О l О & ОЫl О О 1 1 рез у льта т : оы ооо
Побитовое OR ОЫО 1 0 ОЫl О О 1 1 рез у ль та т : ОЫ1 1 0
Побитовое XOR ОЫ0 1 0 л ОЫl О О 1 1 рез у ль та т : ОЬ011 0
Побитовое NOT - О Ы О 1 0 1 1 рез у ль та т : ОЬ0 1 0 1
<< Сдвиг влево ОЫО 1 0 « 1 1 1 рез у ль та т : ОЫ О1 00
ОЫО 1 0 « 2 1 1 рез у ль та т : ОЫ Оl ООО
>> Сдвиг вправо (См. ниже)
>>> Сдвиг вправо с запол- (См. ниже)
нением н у лями
Обратите внимание, что сдвиг влево фактически умножает число на два, а сдвиг
вправо фактически делит его на два и округляет в меньшую сторону.
В двоичном дополнительном коде крайний слева бит обозначает знак числа. Для
отрицательных чисел он содержит 1 , а для положительных - О, следовательно, есть
два способа выполнить сдвиг вправо. Давайте возьмем, например, число -22. Если
мы хотим получить его двоичное представление, начнем с положительного числа 22,
представим его в обратном коде ( т.е. инвертируем все его биты), а затем добавим
к полученному результату единицу, чтобы получить двоичный дополнительный код.
let n = 22 / / 32-разрядное двоичное число :
0
1 1 00000000000000000000000000 1 0 1 1 0
n > > 1 / / 00000000000000000000000000001011
n >>> 1 // 00000000000000000000000000001 011
n = -n / / обратный код числа : 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 01
1 Язык С многие современные эксперты в программировании относят к низкоуровневым, хотя,
строго говоря, это не так. - П р имеч. ред.
120 Глава 5. Выражения и операторы

