Битовые операции в JavaScript
- Предыдущая страница Деструктуризация JS
- Следующая страница Регулярные выражения JS
Битовые операции в JavaScript
Оператор | Название | Описание |
---|---|---|
& | AND | Если оба двоичных числа равны 1, то устанавливается каждый бит в 1 |
| | OR | Если один из двоичных чисел равно 1, то устанавливается каждый бит в 1 |
^ | XOR | Если в двоичных числах только один бит равен 1, то устанавливается каждый бит в 1 |
~ | NOT | Инвертирование всех бит |
<< | Смещение в левую сторону с заполнением нулями | Через ввод нуля с правого в левый смещение и отщепление левого бита. |
>> | Смещение в правую сторону с сохранением знака | Через ввод копии самого левого бита с левого в правый смещение и отщепление правого бита. |
>>> | Смещение в правую сторону с заполнением нулями | Через ввод нуля с левого в правый смещение и отщепление правого бита. |
Пример
Операция | Результат | Эквивалентно | Результат |
---|---|---|---|
5 & 1 | 1 | 0101 & 0001 | 0001 |
5 | 1 | 5 | 0101 | 0001 | 0101 |
5 ^ 1 | 4 | 0101 ^ 0001 | 0100 |
~ 5 | 10 | ~0101 | 1010 |
5 << 1 | 10 | 0101 << 1 | 1010 |
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-битные сигнатурные целые числа, JavaScript возвращает -6.
00000000000000000000000000000101 (5)
11111111111111111111111111111010 (~5 = -6)
Сигнатурные целые числа используют левый крайний разряд в качестве знака.
Битовое исчисление AND
Когда выполняется битовое исчисление AND для пары разрядов, если все разряды равны 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 |
Битовое исчисление OR
Когда выполняется битовое исчисление OR для пары разрядов, если один из разрядов равен 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
Когда выполняется битовое исчисление 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 битовое исчисление AND (&)
Если все разряды равны 1, то битовое исчисление AND возвращает 1:
десятичная | бинарная |
---|---|
5 | 00000000000000000000000000000101 |
1 | 00000000000000000000000000000001 |
5 & 1 | 00000000000000000000000000000001 (1) |
Пример
var x = 5 & 1;
JavaScript битовое исчисление OR (|)
Если один из разрядов равен 1, то битовое вычитание OR возвращает 1:
десятичная | бинарная |
---|---|
5 | 00000000000000000000000000000101 |
1 | 00000000000000000000000000000001 |
5 | 1 | 00000000000000000000000000000101 (5) |
Пример
var x = 5 | 1;
Битовое вычитание XOR (^)
Если разряды различаются, то XOR возвращает 1:
десятичная | бинарная |
---|---|
5 | 00000000000000000000000000000101 |
1 | 00000000000000000000000000000001 |
5 ^ 1 | 00000000000000000000000000000100 (4) |
Пример
var x = 5 ^ 1;
Битовое вычитание NOT (~)
десятичная | бинарная |
---|---|
5 | 00000000000000000000000000000101 |
~5 | 11111111111111111111111111111010 (-6) |
Пример
var x = ~5;
Левое смещение с заполнением нулями (<<)
Это левое смещение с заполнением нулями. Один или несколько нулевых разрядов вводятся с правой стороны, а левые разряды удаляются:
десятичная | бинарная |
---|---|
5 | 00000000000000000000000000000101 |
5 << 1 | 00000000000000000000000000001010 (10) |
Пример
var x = 5 << 1;
Правое смещение с сохранением знака (>>)
Это правое смещение с сохранением знака. Один или несколько разрядов вводятся с левой стороны, а правые разряды удаляются:
десятичная | бинарная |
---|---|
-5 | 11111111111111111111111111111011 |
-5 >> 1 | 11111111111111111111111111111101 (-3) |
Пример
var x = -5 >> 1;
Правое смещение с заполнением нулями (>>>)
Это правое смещение с заполнением нулями. Один или несколько нулевых разрядов вводятся с левой стороны, а правые разряды удаляются:
десятичная | бинарная |
---|---|
5 | 00000000000000000000000000000101 |
5 >>> 1 | 00000000000000000000000000000010 (2) |
Пример
var x = 5 >>> 1;
32-битное целое число с знаковой частью (бинарное число)
Простота понимания 32-битного целого числа с одним установленным битом очевидна:
Двоичная запись | Десятичное значение |
---|---|
00000000000000000000000000000001 | 1 |
00000000000000000000000000000010 | 2 |
00000000000000000000000000000100 | 4 |
00000000000000000000000000001000 | 8 |
00000000000000000000000000010000 | 16 |
00000000000000000000000000100000 | 32 |
00000000000000000000000001000000 | 64 |
Добавление дополнительных разрядов открывает шаблоны двоичной системы:
Двоичная запись | Десятичное значение |
---|---|
00000000000000000000000000000101 | 5 (4 + 1) |
00000000000000000000000000101000 | 40 (32 + 8) |
00000000000000000000000000101101 | 45 (32 + 8 + 4 + 1) |
Отрицательные числа являются двоичным дополнением положительных чисел + 1:
Двоичная запись | Десятичное значение |
---|---|
00000000000000000000000000000101 | 5 |
11111111111111111111111111111011 | -5 |
00000000000000000000000000101000 | 40 |
11111111111111111111111111011000 | -40 |
11111111111111111111111111011001 | -41 |
Преобразование десятичного в двоичное
Пример
function dec2bin(dec){ return (dec >>> 0).toString(2); }
Преобразование двоичного в десятичное
Пример
function bin2dec(bin){ return parseInt(bin, 2).toString(10); }
- Предыдущая страница Деструктуризация JS
- Следующая страница Регулярные выражения JS