Несмотря на то, что все числа в JavaScript вещественные, поразрядные операторы требуют в качестве операндов целые числа. Они работают с такими операндами с помощью 32_разрядного целого представления, а не эквивалентного представле_ ния с плавающей точкой. Четыре из этих операторов выполняют поразрядные операции булевой алгебры, аналогично описанным ранее логическим операторам, но рассматривая каждый бит операнда как отдельное логическое значение. Три других поразрядных оператора применяются для сдвига битов влево и вправо.
Если операнды не являются целыми числами или слишком велики и не помеща_ ются в 32_разрядное целое, поразрядные операторы просто «втискивают» опе_ ранды в 32_разрядное целое, отбрасывая дробную часть операнда и любые биты старше 32_го. Операторы сдвига требуют, чтобы значение правого операнда было целым числом от 0 до 31. После преобразования этого операнда в 32_разрядное целое вышеописанным образом они отбрасывают любые биты старше 5_го, полу_ чая число в соответствующем диапазоне.
Те, кто не знаком с двоичными числами и двоичным представлением десятич_ ных целых чисел, могут пропустить операторы, рассматриваемые в этом разде_ ле. Они требуются для низкоуровневых манипуляций с двоичными числами и достаточно редко применяются при программировании на JavaScript. Далее приводится список поразрядных операторов:
Поразрядное И (&)
Оператор & выполняет операцию «логическое И» над каждым битом своих операндов. Бит результата будет равен 1, только если равны 1 соответствую_ щие биты обоих операндов. То есть выражение 0x1234 & 0x00FF даст в результа_ те число 0x0034.
Поразрядное ИЛИ (|)
Оператор | выполняет операцию «логическое ИЛИ» над каждым битом своих операндов. Бит результата будет равен 1, если равен 1 соответствующий бит хотя бы в одном операнде. Например, 9 | 10 равно 11.
Поразрядное исключающее ИЛИ (^)
Оператор ^ выполняет логическую операцию «исключающее ИЛИ» над каж_ дым битом своих операндов. Исключающее ИЛИ обозначает, что должен быть истинен либо первый операнд, либо второй, но не оба сразу. Бит резуль_ тата устанавливается, если соответствующий бит установлен в одном (но не в обоих) из двух операндов. Например, 9 ^ 10 равно 3.
92 Глава 5. Выражения и операторы
Поразрядное НЕ (~)
Оператор ~ представляет собой унарный оператор, указываемый перед своим единственным целым аргументом. Он выполняет инверсию всех битов опе_ ранда. Из_за способа представления целых со знаком в JavaScript применение оператора ~ к значению эквивалентно изменению его знака и вычитанию 1. Например, ~0x0f равно 0xfffffff0, или _16.
Сдвиг влево (<<)
Оператор << сдвигает все биты в первом операнде влево на количество пози_ ций, указанное во втором операнде, который должен быть целым числом в диапазоне от 0 до 31. Например, в операции a << 1 первый бит в a становится вторым битом, второй бит становится третьим и т. д. Новым первым битом становится ноль, значение 32_го бита теряется. Сдвиг значения влево на одну позицию эквивалентен умножению на 2, на две позиции – умножению на 4, и т. д. Например, 7 << 1 равно 14.
Сдвиг вправо с сохранением знака (>>)
Оператор >> перемещает все биты своего первого операнда вправо на количе_ ство позиций, указанное во втором операнде (целое между 0 и 31). Биты, сдвинутые за правый край, теряются. Самый старший бит (32_й) не меняется, чтобы сохранить знак результата. Если первый операнд положителен, стар_ шие биты результата заполняются нулями; если первый операнд отрицате_ лен, старшие биты результата заполняются единицами. Сдвиг значения вправо на одну позицию эквивалентен делению на 2 (с отбрасыванием остат_ ка), а сдвиг вправо на две позиции эквивалентен делению на 4 и т. д. Напри_ мер, 7 >> 1 равно 3, а _7 >> 1 равно _4.
Сдвиг вправо с заполнением нулями (>>>)
Оператор >>> аналогичен оператору >> за исключением того, что при сдвиге старшие разряды заполняются нулями независимо от знака первого операн_ да. Например, _1 >> 4 равно _1, а _1 >>> 4 равно 268435455 (0x0fffffff).