Битовые операции в JavaScript

Битовые операции в 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);
}

Попробуйте сами