Побитовые операторы JavaScript
- Представление 32 битного целого числа со знаком
- Побитовое И (&)
- Побитовое ИЛИ (|)
- Побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ (^)
- Побитовое НЕ (~)
- Сдвиг битов влево (<<)
- Сдвиг битов вправо с сохранением знака (>>)
- Сдвиг битов вправо с заполнением нулями (>>>)
Побитовые операторы требуют в качестве операндов 32-ух разрядные целые числа, поэтому значения преобразуются из 64-разрядных чисел в 32-разрядные, затем для них выполняется нужная операция, а полученный результат преобразуется обратно в 64-разрядный формат.
Все побитовые операторы преобразуют операнды по тем же правилам, что и функция Number(). Специальные значения NaN и Infinity в поразрядных операциях интерпретируются как 0.
Представление 32 битного целого числа со знаком
В целых числах со знаком все биты, кроме 32-го, представляют само значение, тогда как 32-й бит определяет знак числа: 0 для неотрицательных чисел и 1 для отрицательных. Так как 32-й бит определяет знак числа, его называют знаковым (sign bit). Целые неотрицательные числа хранятся в настоящем двоичном формате. Например, число 18 представляется как 00000000000000000000000000010010, или, сокращённо, как 10010. Эти пять битов и являются фактическим значением числа.
Отрицательные числа также хранятся в двоичном коде, но в формате, который называется дополнительным кодом
. Дополнительный код вычисляется в три этапа:
- Определяется двоичное представление абсолютного значения числа. Например, для числа -18 сначала определяется двоичное представление числа 18 (это абсолютное значение числа -18).
- Находится обратный код числа. Это означает, что каждый нуль заменяется единицей и наоборот.
- К полученному результату прибавляется единица.
К примеру, определим двоичное представление числа -18. Начнём с двоичного представления его абсолютного значения (18):
0000 0000 0000 0000 0000 0000 0001 0010
Далее определяем обратный код:
1111 1111 1111 1111 1111 1111 1110 1101
И прибавляем единицу к обратному двоичному коду числа:

Таким образом, двоичным эквивалентом -18 является 11111111111111111111111111101110. Однако в JavaScript такое двоичное представление чисел скрыто, поэтому, при выводе отрицательного числа в двоичном представлении вы получите двоичный код его абсолютного значения со знаком минус:
var num = -18; alert(num.toString(2)); // "-10010"
Побитовое И (&)
| Оператор | Тип оператора | А | О | Типы значений |
|---|---|---|---|---|
… & … |
Побитовое И | слева направо | 2 | целое, целое → целое |
Оператор & (побитовое И) выполняет операцию И для каждой пары битов в соответствующих разрядах. Ниже приведена таблица истинности для операции И:
| Бит первого числа | Бит второго числа | Результат |
|---|---|---|
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
В следующем примере операция И выполняется для чисел 14 и 9:
/*
9 = 00000000000000000000000000001001
14 = 00000000000000000000000000001110
--------------------------------
14 & 9 = 00000000000000000000000000001000 = 8
*/
var result = 14 & 9;
alert(result); // 8
Побитовое ИЛИ (|)
| Оператор | Тип оператора | А | О | Типы значений |
|---|---|---|---|---|
… | … |
Побитовое ИЛИ | слева направо | 2 | целое, целое → целое |
Оператор | (побитовое ИЛИ) выполняет операцию ИЛИ для каждой пары битов в соответствующих разрядах. Ниже приведена таблица истинности для операции ИЛИ:
| Бит первого числа | Бит второго числа | Результат |
|---|---|---|
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
В следующем примере операция ИЛИ выполняется для чисел 14 и 9:
/*
9 = 00000000000000000000000000001001
14 = 00000000000000000000000000001110
--------------------------------
14 | 9 = 00000000000000000000000000001111 = 15
*/
var result = 14 | 9;
alert(result); // 15
Побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ (^)
| Оператор | Тип оператора | А | О | Типы значений |
|---|---|---|---|---|
… ^ … |
Побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ | слева направо | 2 | целое, целое → целое |
Оператор ^ (побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ) выполняет операцию ИСКЛЮЧАЮЩЕЕ ИЛИ для каждой пары битов в соответствующих разрядах. Ниже приведена таблица истинности для операции ИСКЛЮЧАЮЩЕЕ ИЛИ:
| Бит первого числа | Бит второго числа | Результат |
|---|---|---|
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
В следующем примере операция ИСКЛЮЧАЮЩЕЕ ИЛИ выполняется для чисел 14 и 9:
/*
9 = 00000000000000000000000000001001
14 = 00000000000000000000000000001110
--------------------------------
14 ^ 9 = 00000000000000000000000000000111 = 7
*/
var result = 14 ^ 9;
alert(result); // 7
Побитовое НЕ (~)
| Оператор | Тип оператора | А | О | Типы значений |
|---|---|---|---|---|
~ … |
Побитовое НЕ (инверсия) | справа налево | 1 | целое → целое |
Оператор ~ (побитовое НЕ) выполняет операцию НЕ (инверсию) для каждого бита числа. Ниже приведена таблица истинности для операции НЕ:
| Бит числа | Результат |
|---|---|
0 |
1 |
1 |
0 |
В следующем примере операция НЕ выполняется для числа 9:
/*
9 = 00000000000000000000000000001001
--------------------------------
~9 = 11111111111111111111111111110110 = -10
*/
var num = ~9;
alert(num); // -10
Сдвиг битов влево (<<)
| Оператор | Тип оператора | А | О | Типы значений |
|---|---|---|---|---|
… << … |
Сдвиг битов влево | слева направо | 2 | целое, целое → целое |
Оператор << (сдвиг битов влево) сдвигает все биты числа влево на указанное количество разрядов. Слева от оператора указывается число, биты которого будут сдвинуты, справа от оператора указывается целое число в диапазоне от 0 до 31, которое определяет на сколько разрядов влево будут сдвинуты биты числа. При сдвиге битов влево освободившиеся разряды справа заполняются нулями.
В следующем примере сдвиг битов влево выполняется для числа 9:
/*
9 = 00000000000000000000000000001001
--------------------------------
9 << 2 = 00000000000000000000000000100100 = 36
*/
var result = 9 << 2;
alert(result); // 36
Сдвиг битов вправо с сохранением знака (>>)
| Оператор | Тип оператора | А | О | Типы значений |
|---|---|---|---|---|
… >> … |
Сдвиг битов вправо с сохранением знака | слева направо | 2 | целое, целое → целое |
Оператор >> (сдвиг битов вправо с сохранением знака) сдвигает все биты числа (кроме знакового) вправо на указанное количество разрядов. Слева от оператора указывается число, биты которого будут сдвинуты, справа от оператора указывается целое число в диапазоне от 0 до 31, которое определяет на сколько разрядов вправо будут сдвинуты биты числа. При сдвиге битов вправо в освободившиеся разряды (после знакового бита) копируется знаковый бит.
В следующем примере сдвиг битов вправо выполняется для чисел 9 и -9:
/*
9 = 00000000000000000000000000001001
--------------------------------
9 >> 2 = 00000000000000000000000000000010 = 2
-9 = 11111111111111111111111111110111
--------------------------------
-9 >> 2 = 11111111111111111111111111111101 = -3
*/
var result1 = 9 >> 2;
var result2 = -9 >> 2;
alert(result1); // 2
alert(result2); // -3
Сдвиг битов вправо с заполнением нулями (>>>)
| Оператор | Тип оператора | А | О | Типы значений |
|---|---|---|---|---|
… >>> … |
Сдвиг битов вправо с заполнением нулями | слева направо | 2 | целое, целое → целое |
Оператор >>> (сдвиг битов вправо с заполнением нулями) сдвигает все биты числа вправо на указанное количество разрядов. Слева от оператора указывается число, биты которого будут сдвинуты, справа от оператора указывается целое число в диапазоне от 0 до 31, которое определяет на сколько разрядов вправо будут сдвинуты биты числа. При сдвиге битов вправо освободившиеся разряды слева заполняются нулями.
В следующем примере сдвиг битов вправо выполняется для чисел 9 и -9:
/*
9 = 00000000000000000000000000001001
--------------------------------
9 >>> 2 = 00000000000000000000000000000010 = 2
-9 = 11111111111111111111111111110111
--------------------------------
-9 >>> 2 = 00111111111111111111111111111101 = 1073741821
*/
var result1 = 9 >>> 2;
var result2 = -9 >>> 2;
alert(result1); // 2
alert(result2); // 1 073 741 821
С этой темой смотрят: