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

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

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

Примеры:

ОперацияРезультатТо же, чтоРезультат
5 & 110101 & 00011
5 | 150101 | 0001101
5 ^ 140101 ^ 0001100
~510~01011010
5 << 1100101 << 11010
5 >> 120101 >> 110
5 >>> 120101 >>> 110

Числовые значения в 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 & 00
0 & 10
1 & 00
1 & 11

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

ОперацияРезультат
1111 & 00000
1111 & 00011
1111 & 001010
1111 & 0100100

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

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

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

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

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

ОперацияРезультат
1111 | 00001111
1111 | 00011111
1111 | 00101111
1111 | 01001111

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

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

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

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

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

ОперацияРезультат
1111 ^ 00001111
1111 ^ 00011110
1111 ^ 00101101
1111 ^ 01001011

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

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

ДесятичноеДвоичное
500000000000000000000000000000101 (5)
100000000000000000000000000000001 (1)
5 & 100000000000000000000000000000001 (1)

Пример:


var x = 5 & 1; 

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

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

ДесятичноеДвоичное
500000000000000000000000000000101 (5)
100000000000000000000000000000001 (1)
5 | 100000000000000000000000000000101 (5)

Пример:


var x = 5 | 1; 

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

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

ДесятичноеДвоичное
500000000000000000000000000000101 (5)
100000000000000000000000000000001 (1)
5 ^ 100000000000000000000000000000100 (4)

Пример:


var x = 5 ^ 1; 

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

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

Пример:


var x = ~5; 

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

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

ДесятичноеДвоичное
500000000000000000000000000000101 (5)
5 << 100000000000000000000000000001010 (10)

Пример:


var x = 5 << 1; 

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

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

ДесятичноеДвоичное
-511111111111111111111111111111011 (-5)
-5 >> 111111111111111111111111111111101 (-3)

Пример:


var x = -5 >> 1; 

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

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

ДесятичноеДвоичное
500000000000000000000000000000101 (5)
5 >>> 100000000000000000000000000000010 (2)

Пример:


var x = 5 >>> 1; 

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


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

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


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