Побитовые операции JavaScript
Побитовые операторы JavaScript
Operator | Name | Description |
---|---|---|
& | AND | Sets each bit to 1 if both bits are 1 |
| | OR | Sets each bit to 1 if one of two bits is 1 |
^ | XOR | Sets each bit to 1 if only one of two bits is 1 |
~ | NOT | Inverts all the bits |
<< | Zero fill left shift | Shifts left by pushing zeros in from the right and let the leftmost bits fall off |
>> | Signed right shift | Shifts right by pushing copies of the leftmost bit in from the left, and let the rightmost bits fall off |
>>> | Zero fill right shift | Shifts right by pushing zeros in from the left, and let the rightmost bits fall off |
Примеры
Operation | Result | Same as | Result |
---|---|---|---|
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-битные целые числа со знаком.
После выполнения побитовой операции результат преобразуется обратно в 64-битные числа JavaScript.
В приведенных выше примерах используются 4-битные двоичные числа без знака. Из-за этого ~ 5 возвращает 10.
Поскольку JavaScript использует 32-битные целые числа со знаком, он не вернет 10. Он вернет -6.
00000000000000000000000000000101 (5)
11111111111111111111111111111010 (~5 = -6)
Целое число со знаком использует крайний левый бит в качестве знака минус.
Побитовое И
Когда к паре битов применяется побитовое И, возвращается 1, если оба бита равны 1.
Операция | Результат |
---|---|
0 и 0 | 0 |
0 и 1 | 0 |
1 и 0 | 0 |
1 и 1 | 1 |
Операция | Результат |
---|---|
1111 и 0000 | 0000 |
1111 и 0001 | 0001 |
1111 и 0010 | 0010 |
1111 и 0100 | 0100 |
Побитовое ИЛИ
Когда к паре битов применяется побитовое ИЛИ, возвращается 1, если один из битов равен 1:
Операция | Результат |
---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
Операция | Результат |
---|---|
1111 | 0000 | 1111 |
1111 | 0001 | 1111 |
1111 | 0010 | 1111 |
1111 | 0100 | 1111 |
Побитовое исключающее ИЛИ
Когда побитовое XOR выполняется для пары битов, оно возвращает 1, если биты различны:
Операция | Результат |
---|---|
0 ^ 0 | 0 |
0 ^ 1 | 1 |
1 ^ 0 | 1 |
1 ^ 1 | 0 |
Операция | Результат |
---|---|
1111^0000 | 1111 |
1111^0001 | 1110 |
1111^0010 | 1101 |
1111^0100 | 1011 |
Побитовое И (&) в JavaScript
Побитовое И возвращает 1, только если оба бита равны 1:
Десятичный | Бинарный |
---|---|
5 | 000000000000000000000000000000101 |
1 | 000000000000000000000000000000001 |
5 и 1 | 00000000000000000000000000000001 (1) |
Пример
let x = 5 & 1;
Побитовое ИЛИ в JavaScript (|)
Побитовое ИЛИ возвращает 1, если один из битов равен 1:
Десятичный | Бинарный |
---|---|
5 | 000000000000000000000000000000101 |
1 | 000000000000000000000000000000001 |
5 | 1 | 00000000000000000000000000000101 (5) |
Пример
let x = 5 | 1;
Побитовое исключающее ИЛИ в JavaScript (^)
Побитовое XOR возвращает 1, если биты разные:
Десятичный | Бинарный |
---|---|
5 | 000000000000000000000000000000101 |
1 | 000000000000000000000000000000001 |
5 ^ 1 | 00000000000000000000000000000100 (4) |
Пример
let x = 5 ^ 1;
JavaScript побитовое НЕ (~)
Десятичный | Бинарный |
---|---|
5 | 000000000000000000000000000000101 |
~5 | 11111111111111111111111111111010 (-6) |
Пример
let x = ~5;
JavaScript (нулевое заполнение) Побитовый сдвиг влево (<<)
Это нулевой сдвиг влево. Один или несколько нулевых битов вставляются справа, а крайние левые биты отбрасываются:
Десятичный | Бинарный |
---|---|
5 | 000000000000000000000000000000101 |
5 << 1 | 00000000000000000000000000001010 (10) |
Пример
let x = 5 << 1;
JavaScript (сохранение знаков) Побитовый сдвиг вправо (>>)
Это знак, сохраняющий правый сдвиг. Копии крайнего левого бита вставляются слева, а крайние правые биты отбрасываются:
Десятичный | Бинарный |
---|---|
-5 | 111111111111111111111111111111011 |
-5 >> 1 | 11111111111111111111111111111101 (-3) |
Пример
let x = -5 >> 1;
JavaScript (нулевая заливка) Shift вправо (>>>)
Это смещение вправо с нулевым заполнением. Один или несколько нулевых битов вставляются слева, а крайние правые биты отбрасываются:
Десятичный | Бинарный |
---|---|
5 | 000000000000000000000000000000101 |
5 >>> 1 | 00000000000000000000000000000010 (2) |
Пример
let x = 5 >>> 1;
Двоичные числа
Двоичные числа с одним набором битов легко понять:
Двоичное представление | Десятичное значение |
---|---|
000000000000000000000000000000001 | 1 |
000000000000000000000000000000010 | 2 |
000000000000000000000000000000100 | 4 |
000000000000000000000000000001000 | 8 |
00000000000000000000000000010000 | 16 |
00000000000000000000000000100000 | 32 |
00000000000000000000000001000000 | 64 |
Установка еще нескольких битов раскрывает двоичный шаблон:
Двоичное представление | Десятичное значение |
---|---|
000000000000000000000000000000101 | 5 (4 + 1) |
00000000000000000000000000001101 | 13 (8 + 4 + 1) |
00000000000000000000000000101101 | 45 (32 + 8 + 4 + 1) |
Двоичные числа JavaScript хранятся в формате дополнения до двух.
Это означает, что отрицательное число является побитовым НЕ числа плюс 1:
Двоичное представление | Десятичное значение |
---|---|
000000000000000000000000000000101 | 5 |
111111111111111111111111111111011 | -5 |
000000000000000000000000000000110 | 6 |
111111111111111111111111111111010 | -6 |
00000000000000000000000000101000 | 40 |
111111111111111111111111111011000 | -40 |
Преобразование десятичного числа в двоичное
Пример
function dec2bin(dec){
return (dec >>> 0).toString(2);
}
Преобразование двоичного в десятичное
Пример
function bin2dec(bin){
return parseInt(bin, 2).toString(10);
}