Операции с битами не очень распространены в JavaScript, но бывает, что без них не обойтись
Чтобы понять, как работают побитовые операции в JS, тебе нужны 2 вещи:
- разобраться в том, что такое двоичная (бинарная) система счисления
- как переводить числа из десятичной системы в двоичную и обратно
Ответы на эти вопросы и введение ты можешь найти тут.
Обзор всех побитовых операций в JavaScript
Оператор | Название | Описание |
---|---|---|
& |
И | Если оба бита равны 1 - результат 1. Если хотя бы один из них 0, то и результат 0. |
` | ` | ИЛИ |
^ |
Исключающее ИЛИ (XOR) | Если оба бита одинаковые - результат 0. Если биты разные, то результат - 1. |
~ |
НЕ | Инвертирует все биты в числе. Нули становятся единицами, а единицы - нулями. |
<< |
Сдвиг влево | Сдвигает все биты влево, заполняет пустые слоты нулями. |
>> |
Знаковый сдвиг вправо | Сдвигает все биты вправо, заполняет пусты слоты значением самого левого бита числа. Таким образом знак числа не меняется. |
>>> |
Беззнаковый сдвиг вправо | Сдвигает все биты вправо, заполняет пустые слоты нулями. |
Примеры и использование
Побитовые операторы в JavaScript будет сложно понять, если применять их к десятичным числам.
Советую взять лист бумаги, карандаш и начать с того, чтобы перевести все десятичные числа из примеров в их двоичное представление.
Операторы И, ИЛИ, XOR
Операторам &
, |
и ^
требуется 2 числа, чтобы правильно работать. Они сравнивают биты в числах по одному используя правила из таблицы выше.
Давай попробуем их применить. Двоичное представление чисел записано справа в комментариях:
const x = 5; // 0101
const y = 6; // 0110
Будет проще считать, если ты запишешь двоичные числа в столбик. Вот так:
И 0101 ИЛИ 0101 XOR 0101
0110 0110 0110
---- ---- ----
0100 0111 0011
Сейчас, мы добавим console.log
и проверим, правильно ли мы посчитали:
console.log(x & y); // 4
console.log(x || y); // 7
console.log(x ^ y); // 3
Важная особенность XOR в том, что, если ты с обеих сторон оператора напишешь одно и то же число, то в итоге всегда получишь ноль.
console.log(x ^ x); // 0
console.log(y ^ y); // 0
С другой стороны, если заменишь ^
на &
или |
, то число не изменится
Оператор НЕ
Оператор ~
работает иначе. Он называется унарным оператором и применяется к одному числу.
НЕ 0101 => 1010
НЕ 0110 => 1001
console.log(~x); // -6
console.log(~y); // -7
Знаковый бит тоже меняется, так как он определяется самым левым битом в JavaScript числах. Если он равен 0
, то число положительное, 1
- отрицательное.
Если ты применишь оператор ~
дважды к одному и тому же числу, то ты вернешься туда, откуда начал:
console.log(~~x); // 5
Операторы побитового сдвига
Операторам побитового сдвига нужно 2 числа. Первое — само число, биты которого мы будем двигать. Второе — количество двоичных разрядов на которое будет выполнен сдвиг.
Сдвиг влево
Сдвинуть двоичное число на 1 разряд влево — это то же самое, что умножить его на два. Исключение — большие числа, которые после умножения не поместятся в памяти.
console.log(x << 1); // 10
console.log(y << 2); // 24
Сдвиг вправо
Правый сдвиг, в отличие от левого, делает числа меньше. Если число достаточно большое, то это будет эквивалентно делению на два. В нашем случае, с маленькими числами, все не так просто:
console.log(x >> 1); // 2
console.log(y >> 2); // 1
Не ленись, бери карандаш и проверь расчеты самостоятельно!
Беззнаковый сдвиг вправо
Беззнаковый сдвиг вправо отличается тем, что он не сохраняет знаковый бит (самый левый). Когда он применяется к отрицательным числам, то они станут положительными, потому что все пустые места будет заполнены нулями.
const n = 100;
const m = -100;
console.log(n >>> 2); // 25
console.log(m >>> 2); // 1073741799
Не удивительно, что мы сдвинули 100
на 2 бита вправо и получили число в 4
раза меньше.
Но ты понимаешь почему -100
превратилось в 1073741799
?
Выводы
Если ты занимаешься веб разработкой, то тебе, скорее всего, нечасто придется сталкиваться с побитовыми операциями в JavaScript.
С другой стороны, если ты ищешь работу и ходишь по собеседованиям, то это одна из любимых тем “на засыпку”. Многие задачи решаются очень красиво с помощью побитовых операций. Например, определить является ли число четным.
Если ты готовишься к собеседованиям, попробуй мобильное приложение Coderslang. В нем более 1500 вопросов по JavaScript, HTML/CSS, Java, C#, Node.js, React.js, React Native, и QA. Скачать можно на iOS и Android.