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

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

Оператор Название Описание
& И Возвращает 1, если оба бита равны 1
| ИЛИ Возвращает 1, если хотя бы один из двух битов равен 1
^ ИСКЛЮЧАЮЩЕЕ ИЛИ Возвращает 1, если только один из двух битов равен 1, но не оба
~ НЕ Инвертирует все биты
<< Побитовый сдвиг влево Сдвиг влево с заполнением появившихся младших (справа) битов нулями
>> Побитовый сдвиг вправо со знаком Сдвиг вправо с копированием знака (арифметический сдвиг вправо). Пустые биты заполняются копией крайнего левого бита
>>> Побитовый сдвиг вправо Сдвиг вправо с заполнением появившихся старших (слева) битов нулями

Примеры:

Операция Результат То же, что Результат
5 & 1 1 0101 & 0001 1
5 | 1 5 0101 | 0001 101
5 ^ 1 4 0101 ^ 0001 100
~5 10 ~0101 1010
5 << 1 10 0101 << 1 1010
5 >> 1 2 0101 >> 1 10
5 >>> 1 2 0101 >>> 1 10

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

Перед выполнением побитовой операции JavaScript преобразует числовые операнды в 32 битные целые числа со знаком. После завершения побитовой операции результат преобразуется обратно в 64 битное число.

В примерах в таблице выше приведены 4-битные числа без знака. Поэтому ~5 возвращает 10.

В действительности же JavaScript использует 32-битные числа со знаком. Таким образом, в JavaScript выражение ~ 5 вернет не 10, а -6:

00000000000000000000000000000101 (5)
11111111111111111111111111111010 (~5 = -6)

В целых числах со знаком самый левый бит используется для указания знака.

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

Если побитовое И (AND) выполняется с парой бит, то 1 возвращается тогда, когда оба бита равны 1.

Пример с 1-битовыми числами:

Операция Результат
0 & 0 0
0 & 1 0
1 & 0 0
1 & 1 1

Пример с 4-битовыми числами:

Операция Результат
1111 & 0000 0
1111 & 0001 1
1111 & 0010 10
1111 & 0100 100

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

Если побитовое ИЛИ (OR) выполняется с парой бит, то 1 возвращается тогда, когда один из битов равен 1.

Пример с 1-битовыми числами:

Операция Результат
0 | 0 0
0 | 1 1
1 | 0 1
1 | 1 1

Пример с 4-битовыми числами:

Операция Результат
1111 | 0000 1111
1111 | 0001 1111
1111 | 0010 1111
1111 | 0100 1111

Побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)

Если побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR) выполняется с парой бит, то 1 возвращается тогда, когда биты различны.

Пример с 1-битовыми числами:

Операция Результат
0 ^ 0 0
0 ^ 1 1
1 ^ 0 1
1 ^ 1 0

Пример с 4-битовыми числами:

Операция Результат
1111 ^ 0000 1111
1111 ^ 0001 1110
1111 ^ 0010 1101
1111 ^ 0100 1011

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

Побитовое И возвращает 1 в том случае, если оба бита равны 1:

Десятичное Двоичное
5 00000000000000000000000000000101 (5)
1 00000000000000000000000000000001 (1)
5 & 1 00000000000000000000000000000001 (1)

Пример:


var x = 5 & 1; 

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

Побитовое ИЛИ возвращает 1 в том случае, если хотя бы один из двух битов равен 1:

Десятичное Двоичное
5 00000000000000000000000000000101 (5)
1 00000000000000000000000000000001 (1)
5 | 1 00000000000000000000000000000101 (5)

Пример:


var x = 5 | 1; 

Побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ в JavaScript (^)

Побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ возвращает 1 в том случае, если у битов разное значение:

Десятичное Двоичное
5 00000000000000000000000000000101 (5)
1 00000000000000000000000000000001 (1)
5 ^ 1 00000000000000000000000000000100 (4)

Пример:


var x = 5 ^ 1; 

Побитовое ОТРИЦАНИЕ в JavaScript (~)

Десятичное Двоичное
5 00000000000000000000000000000101 (5)
~5 11111111111111111111111111111010 (-6)

Пример:


var x = ~5; 

Побитовый сдвиг влево в JavaScript (<<)

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

Десятичное Двоичное
5 00000000000000000000000000000101 (5)
5 << 1 00000000000000000000000000001010 (10)

Пример:


var x = 5 << 1; 

Побитовый сдвиг вправо со знаком в JavaScript (>>)

Побитовый сдвиг вправо с копированием знака (арифметический сдвиг вправо) возвращает значение целого числа со сдвигом его битов на несколько позиций вправо. Все пустые биты заполняются копией крайнего левого (т.е. знакового) бита. Копирование крайнего левого бита гарантирует, что целое число останется положительным или отрицательным:

Десятичное Двоичное
-5 11111111111111111111111111111011 (-5)
-5 >> 1 11111111111111111111111111111101 (-3)

Пример:


var x = -5 >> 1; 

Побитовый сдвиг вправо в JavaScript (>>>)

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

Десятичное Двоичное
5 00000000000000000000000000000101 (5)
5 >>> 1 00000000000000000000000000000010 (2)

Пример:


var x = 5 >>> 1; 

Преобразование десятичного значения в двоичное


function dec2bin(dec){
    return (dec >>> 0).toString(2);
} 

Преобразование двоичного значения в десятичное


function bin2dec(bin){
    return parseInt(bin, 2).toString(10);
}