Я изучаю JavaScript около 2 лет и никогда не слышал об этих маленьких чертях. Я очень удивлен, что существует что-то настолько простое и элегантное.

let x = 4 & 5
console.log(x)
// prints 4

Что это за черная магия! Я был так счастлив найти эту радость в языке. Позвольте мне объяснить, как это работает.

Сначала преобразуйте 4 и 5 в двоичное. Если вы не знаете или забыли, как это сделать, вот вам быстрое напоминание.

1|     00000100  // 4
2| AND 00000101  // 5
3| =   00000100

Здесь мы можем увидеть, как оператор «&» дает нам 4 в приведенном выше примере. В двоичной позиции для 4 в обеих двух верхних строках мы видим 1. Таким образом, мы помещаем единицу в двоичную позицию для 4 в строке 3. Ни в одной другой позиции в строках 1. и 2 мы видим 1 в одной и той же позиции для обеих строк. Итак, мы оставляем остальные двоичные позиции в строке 3 равными 0. Прочтите строку 3 и что мы получим? Четыре! Это наш ответ выше.

Это еще не все. Есть еще несколько примеров побитовых операторов. Вот еще одно, что, я уверен, вы можете себе представить.

1|    00000100  // 4
2| OR 00000101  // 5
3| =  00000101

Здесь мы проверяем, что одна из двух двоичных цифр равна 1, и если да, то мы поместим 1 в эту позицию в третьей строке.

Вы можете спросить себя: «Ну, это круто, но для чего, черт возьми, это используется?»

Приведу канонический пример и рассуждения. Представьте, что вы устанавливаете разрешения на чтение или запись на своем компьютере.

const readPermission = 4   // 00000100
const writePermission = 2  // 00000010
let currentPermission = 0  // 00000000
currentPermission = currentPermission | readPermission
// currentPermission          00000000
// readPermission             00000100
// updated currentPermission  00000100
let check = (currentPermission
               // 00000100 
            & readPermission) ? 'yes' : 'no'
               // 00000100
console.log(check)   // 'yes'

Следуя коду построчно, мы видим, что, обновляя currentPermission двоичным readPermission с помощью оператора OR, мы добавляем разрешение нашему пользователю. С помощью оператора AND мы можем проверить, доступно ли разрешение.

Побитовые операции - наиболее эффективное использование памяти при работе с состоянием, требующим нескольких флагов. Здесь мы видим, что в одном байте памяти могло быть до 8 флагов.

Надеюсь, вам понравились эти парни так же, как и мне. Покопайтесь глубже и найдите другие типы побитовых операторов!