JavaScript Битовые операции
Побитовые операторы JavaScript
Оператор | Имя | Описание |
---|---|---|
& | AND | Устанавливает каждый бит 1, если оба бита 1 |
| | OR | Задает каждый бит 1, если один из двух битов 1 |
^ | XOR | Задает каждый бит 1, если только один из двух битов 1 |
~ | NOT | Переворачивает все биты |
<< | Zero fill left shift | Сдвиги влево путем нажатия нулей в справа и пусть левый бит упасть |
>> | Signed right shift | Сдвиг вправо путем нажатия копий левого бита слева, и пусть крайние правая биты падают |
>>> | Zero fill right shift | Сдвиг вправо путем нажатия нулей в слева, и пусть правый биты падать |
Примеры
Операции | Результат | Same as | Результат |
---|---|---|---|
5 & 1 | 1 | 0101 & 0001 | 0001 |
5 | 1 | 5 | 0101 | 0001 | 0101 |
~ 5 | 10 | ~0101 | 1010 |
5 <<1 | 10 | 0101 <<1 | 1010 |
5 ^ 1 | 4 | 0101 ^ 0001 | 0100 |
5>> 1 | 2 | 0101>> 1 | 0010 |
5>>> 1 | 2 | 0101>>> 1 | 0010 |
JavaScript использует битовые операнды 32 бит
JavaScript хранит числа в виде чисел с плавающей запятой в 64 бит, но все битовые операции выполняются с двоичными номерами 32 бит.
До выполнения побитовой операции JavaScript преобразует числа в 32 битов со знаком целых чисел.
После выполнения побитовой операции результат преобразуется обратно в числа JavaScript 64 бит.
В приведенных выше примерах используются 4 бита неподписанных двоичных чисел. Из-за этого ~ 5 возвращает 10.
Поскольку JavaScript использует 32 битов со знаком целых чисел, он не вернет 10. Он вернется-6.
00000000000000000000000000000101 (5)
11111111111111111111111111111010 (~ 5 =-6)
Целое число со знаком использует крайний левый бит в качестве знака минуса.
Побитовое и
При побитовой и выполняется на пару битов, он возвращает 1, если оба бита 1.
Operation | Result |
---|---|
0 & 0 | 0 |
0 & 1 | 0 |
1 & 0 | 0 |
1 & 1 | 1 |
Operation | Result |
---|---|
1111 & 0000 | 0000 |
1111 & 0001 | 0001 |
1111 & 0010 | 0010 |
1111 & 0100 | 0100 |
Побитовое или
При побитовой или выполняется на пару битов, он возвращает 1, если один из битов 1:
Operation | Result |
---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
Operation | Result |
---|---|
1111 | 0000 | 1111 |
1111 | 0001 | 1111 |
1111 | 0010 | 1111 |
1111 | 0100 | 1111 |
Побитовое исключающее
Если битовое исключающее значение выполняется на паре битов, оно возвращает 1, если биты различаются:
Operation | Result |
---|---|
0 ^ 0 | 0 |
0 ^ 1 | 1 |
1 ^ 0 | 1 |
1 ^ 1 | 0 |
Operation | Result |
---|---|
1111 ^ 0000 | 1111 |
1111 ^ 0001 | 1110 |
1111 ^ 0010 | 1101 |
1111 ^ 0100 | 1011 |
Побитовое и (&) JavaScript
Побитовое и возвращает 1, только если оба бита 1:
Десятичных | Двоичном |
---|---|
5 | 00000000000000000000000000000101 |
1 | 00000000000000000000000000000001 |
5 & 1 | 00000000000000000000000000000001 (1) |
Пример
var x = 5 & 1;
JavaScript побитовое или (|)
Побитовое или возвращает 1, если один из битов 1:
Десятичных | Двоичном |
---|---|
5 | 00000000000000000000000000000101 |
1 | 00000000000000000000000000000001 |
5 | 1 | 00000000000000000000000000000101 (5) |
Пример
var x = 5 | 1;
JavaScript побитовое исключающее (^)
Побитовое исключающее возвращает 1, если биты различаются:
Десятичных | Двоичном |
---|---|
5 | 00000000000000000000000000000101 |
1 | 00000000000000000000000000000001 |
5 ^ 1 | 00000000000000000000000000000100 (4) |
Пример
var x = 5 ^ 1;
JavaScript побитовое не (~)
Десятичных | Двоичном |
---|---|
5 | 00000000000000000000000000000101 |
~5 | 11111111111111111111111111111010 (-6) |
Пример
var x = ~5;
JavaScript (нулевой заливки) побитовый левый сдвиг (<<)
Это нулевой заливки влево сдвига. Один или несколько нулевых битов помещаются с правой стороны, и крайние левые биты падают:
Десятичных | Двоичном |
---|---|
5 | 00000000000000000000000000000101 |
5 <<1 | 00000000000000000000000000001010 (10) |
Пример
var x = 5 <<1;
JavaScript (сохранение знака) побитовый правый сдвиг (>>)
Это знак, сохраняющий право смены. Копии крайнего левого бита помещаются слева, а крайние справа биты падают:
Десятичных | Двоичном |
---|---|
-5 | 11111111111111111111111111111011 |
-5>> 1 | 11111111111111111111111111111101 (-3) |
Пример
var x = -5>> 1;
JavaScript (нулевой заливки) правый сдвиг (>>>)
Это нулевой правый сдвиг. Один или несколько нулевых битов помещаются слева, и крайние справа биты падают:
Десятичных | Двоичном |
---|---|
5 | 00000000000000000000000000000101 |
5>>> 1 | 00000000000000000000000000000010 (2) |
Пример
var x = 5>>> 1;
Двоичные числа
Двоичные числа с только один бит набор легко понять:
Двоичное представление | Десятичное значение |
---|---|
00000000000000000000000000000001 | 1 |
00000000000000000000000000000010 | 2 |
00000000000000000000000000000100 | 4 |
00000000000000000000000000001000 | 8 |
00000000000000000000000000010000 | 16 |
00000000000000000000000000100000 | 32 |
00000000000000000000000001000000 | 64 |
Установка нескольких битов показывает двоичный шаблон:
Двоичное представление | Десятичное значение |
---|---|
00000000000000000000000000000101 | 5 (4 + 1) |
00000000000000000000000000001101 | 13 (8 + 4 + 1) |
00000000000000000000000000101101 | 45 (32 + 8 + 4 + 1) |
Двоичные номера JavaScript хранятся в формате дополнения 2.
Это означает, что отрицательное число является битовым не числа плюс 1:
Двоичное представление | Десятичное значение |
---|---|
00000000000000000000000000000101 | 5 |
11111111111111111111111111111011 | -5 |
00000000000000000000000000000110 | 6 |
11111111111111111111111111111010 | -6 |
00000000000000000000000000101000 | 40 |
11111111111111111111111111011000 | -40 |
Преобразование десятичной дроби в двоичный
Пример
function dec2bin(dec){
return (dec>>> 0).toString(2);
}
Преобразование двоичного в десятичное
Пример
function bin2dec(bin){
return parseInt(bin, 2).toString(10);
}