Побитовые операторы в JavaScript

Битовые операторы производят свои преобразования именное с двоичным представлением числа, но возвращают стандартные числовые значения языка JavaScript. Они требуются для низкоуровневых манипуляций с двоичными числами и достаточно редко применяются при про

Побитовые операторы в JavaScript

» » Сообщение:

Побитовые операторы

Несмотря на то, что все числа в JavaScript вещественные, поразрядные операторы требуют в качестве операндов целые числа. Они работают с такими операндами с помощью 32 разрядного целого представления, а не эквивалентного представления с плавающей точкой. Битовые операторы производят свои преобразования именное с двоичным представлением числа, но возвращают стандартные числовые значения языка JavaScript.

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

Ниже представлена таблица побитовых операций:

Операция Использование Описание
Побитовое И a & b Ставит 1 для каждого бита результата, если соответствующие разряды у обоих операндов равны 1
Исключающее ИЛИ (XOR) a ^ b Ставит 1 для каждого бита результата, если только один из соответствующих битов операндов равен 1
Побитовое ИЛИ a | b Ставит 1 для каждого бита результата, если хотя бы один из соответствующих битов равен 1
Побитовое НЕ ~a Это унарная операция, она заменяет каждый бит операнда на противоположный
Сдвиг влево a << b Сдвигает двоичное представление числа a на b разрядов влево, добавляя справа нули
Сдвиг вправо a >> b Сдвигает двоичное представление числа a на b разрядов вправо. Освобождающиеся разряды заполняются знаковым битом
Сдвиг вправо с заполнением нулями a >>> b Сдвигает двоичное представление числа a на b разрядов вправо, отбрасывая сдвигаемые биты и добавляя нули слева

Представление 32 битного целого числа со знаком

Операнды всех побитовых операторов интерпретируются как 32 битные целые числа со знаком и старшим битом слева и дополнением до двойки.

Старший бит слева означает, что самый значимый бит (битовая позиция с самым большим значением) находится на крайнем левом месте.

Дополнение до двойки означает, что двоичный вид числа, обратного данному (например, 5 и обратное ему -5) получается путем инвертирования (оператор побитовое НЕ) всех битов числа с добавлением 1.
Используем для примера число 314, в двоичном коде оно выглядит так:

script Код: Выделить всё Развернуть
00000000000000000000000100111010

Чтобы получить его обратный код - инвертируем биты числа ~314

script Код: Выделить всё Развернуть
11111111111111111111111011000101

Прибавив к нему единицу, мы получаем двоичное представление числа -314

script Код: Выделить всё Развернуть
11111111111111111111111011000110

Принцип дополнения до двойки делит все двоичные представления на два множества: если крайний левый бит равен 0 - число положительное, если 1 - число отрицательное. Поэтому он называется знаковым битом.

Принцип работы

Побитовые операторы работают следующим образом:

  • Операнды конвертируются в 32-х битные целые числа, отображаемые последовательностью нулей и единиц
  • Каждый бит первого операнда рассматривается вместе с соответствующим битом второго операнда: первый бит с первым, второй со вторым и тд.
  • Операция применяется к каждой паре битов, давая соответствующий бит в результате.

Побитовое И (&)

Оператор & выполняет действия, как «логическое И» над каждой парой бит.
Бит результата будет равен 1, только если оба бита равны единице.

Таблица истинности для И:

a b a & b
0 0 0
0 1 0
1 0 0
1 1 1

Пример:

script Код: Выделить всё Развернуть
9 (основание 10) = 00000000000000000000000000001001 (основание 2)
14 (основание 10) = 00000000000000000000000000001110 (основание 2)
--------------------------------
14 & 9 (основание 10) = 00000000000000000000000000001000 (осн. 2) = 8 (осн. 10)

Побитовое ИЛИ (|)

Оператор | выполняет действия, как «логическое ИЛИ» над каждой парой бит.
Бит результата будет равен 1, если хотя бы один бит из a и b равен 1.

Таблица истинности для ИЛИ:

a b a | b
0 0 0
0 1 1
1 0 1
1 1 1

Пример:

script Код: Выделить всё Развернуть
9 (основание 10) = 00000000000000000000000000001001 (основание 2)
14 (основание 10) = 00000000000000000000000000001110 (основание 2)
--------------------------------
14 | 9 (основание 10) = 00000000000000000000000000001111 (осн. 2) = 15 (осн. 10)

Исключающее ИЛИ XOR (^)

Оператор ^ выполняет действия, как «логическое ИЛИ» над каждой парой бит.
Исключающее ИЛИ означает, что должен быть истинен либо первый операнд, либо второй, но не оба сразу.
Бит результата устанавливается, если только a = 1 или только b = 1, но не оба одновременно.

Таблица истинности для исключающего ИЛИ:

a b a ^ b
0 0 0
0 1 1
1 0 1
1 1 0

Пример:

script Код: Выделить всё Развернуть
9 (основание 10) = 00000000000000000000000000001001 (основание 2)
14 (основание 10) = 00000000000000000000000000001110 (основание 2)
--------------------------------
14 ^ 9 (основание 10) = 00000000000000000000000000000111 (осн. 2) = 7 (осн. 10)

Побитовое НЕ (~)

Оператор ~ является унарным. Он выполняет инверсию всех битов операнда.

Таблица истинности для НЕ:

a ~a
0 1
1 0

Пример:

script Код: Выделить всё Развернуть
9 (основание 10)  = 00000000000000000000000000001001 (основание 2)
--------------------------------
~9 (основание 10) = 11111111111111111111111111110110 (осн. 2) = -10 (осн. 10)

Операторы побитового сдвига

Операторы побитового сдвига принимают два операнда.
Левый операнд - это число для сдвига, а правый - количество битов, которые нужно сдвинуть в левом операнде.

Сдвиг влево (<<)

Оператор << сдвигает все биты в левом операнде влево на количество позиций, указанное в правом операнде, который должен быть целым числом в диапазоне от 0 до 31.
Справа добавляются нулевые биты. Сдвиг значения влево на одну позицию эквивалентен умножению на 2, на две позиции - умножению на 4 и тд.

Например, 9 << 2 в результате даст 36:

script Код: Выделить всё Развернуть
9 (основание 10): 00000000000000000000000000001001 (основание 2)
--------------------------------
9 << 2 (основание 10): 00000000000000000000000000100100 (осн. 2) = 36 (осн. 10)

Сдвиг вправо с сохранением знака (>>)

Оператор >> сдвигает все биты своего левого операнда вправо на количество позиций, указанное в правом операнде, который должен быть целым числом в диапазоне от 0 до 31.
Самый старший бит (32й) не меняется, чтобы сохранить знак результата.
Если левый операнд положителен, старшие биты результата заполняются нулями, если операнд отрицателен, старшие биты результата заполняются единицами.
Сдвиг вправо на одну позицию эквивалентен делению на 2 (с отбрасыванием остатка), сдвиг вправо на две позиции эквивалентен делению на 4 и тд.

script Код: Выделить всё Развернуть
9 (основание 10): 00000000000000000000000000001001 (основание 2)
--------------------------------
9 >> 2 (основание 10): 00000000000000000000000000000010 (осн. 2) = 2 (осн. 10)

-9 (основание 10): 11111111111111111111111111110111 (основание 2)
--------------------------------
-9 >> 2 (основание 10): 11111111111111111111111111111101 (осн. 2) = -3 (осн. 10)

Сдвиг вправо с заполнением нулями (>>>)

Оператор >>> аналогичен оператору >> за исключением того, что при сдвиге старшие разряды заполняются нулями независимо от знака левого операнда.

script Код: Выделить всё Развернуть
9 (основание 10): 00000000000000000000000000001001 (основание 2)
--------------------------------
9 >>> 2 (основание 10): 00000000000000000000000000000010 (осн. 2) = 2 (осн. 10)

-9 (основание 10): 11111111111111111111111111110111 (основание 2)
--------------------------------
-9 >>> 2 (основание 10): 00111111111111111111111111111101 (осн. 2) = 1073741821 (осн. 10)

Помимо перечисленных операторов, в JavaScript предусмотрены составные побитовые операторы, упрощающие программирование:

<<= >>= >>>= &= |= ^=
побитовые операторы, целые числа, принцип работы, побитовое and, побитовое or, исключающее xor, операторы сдвига



Похожие темыКомментарии ПросмотрыПоследнее сообщение
02230Предпросмотр картинки перед загрузк...
Сообщение от: Admin
21406Re: Закладки пользователя для сайта...
Сообщение от: Admin
151431Re: Рейтинг материалов +/- (плюс/ми...
Сообщение от: kinouser
0847Javascript Math.random(), аналог PH...
Сообщение от: Admin
3900BBComplex - Классы для каскадных та...
Сообщение от: Admin