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

Привет, будущие кодировщики! Сегодня мы окунемся в fascинирующий мир битовых операторов JavaScript. Теперь я знаю, что вы думаете: "Битовые что?" Не волнуйтесь! К концу этого урока вы будете манипулировать битами как профи. Так что давайте отправимся в это двоичное приключение вместе!

JavaScript - Bitwise Operators

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

Битовые операторы - это особые инструменты в JavaScript, которые позволяют нам работать с числами на уровне битов. Это означает, что мы имеем дело с 1 и 0, как это делают компьютеры изнутри. Может показаться пугающим, но поверьте мне, это на самом деле очень весело, как только вы惯етесь!

Прежде чем мы перейдем к деталям, давайте посмотрим на все битовые операторы, которые мы рассмотрим:

Оператор Имя Описание
& AND Устанавливает каждый бит в 1, если оба бита равны 1
| OR Устанавливает каждый бит в 1, если один из двух битов равен 1
^ XOR Устанавливает каждый бит в 1, если только один из двух битов равен 1
~ NOT Инвертирует все биты
<< Сдвиг влево Сдвигает влево, добавляя нули справа
>> Сдвиг вправо Сдвигает вправо, добавляя копии старшего бита слева
>>> Сдвиг вправо с заполнением нулями Сдвигает вправо, добавляя нули слева

Теперь давайте разберем их по одному!

JavaScript Битовый оператор AND (&)

Битовый оператор AND похож на очень strict охранника в эксклюзивном клубе. Он пропускает 1 только если оба входа равны 1. В противном случае, это 0. Давайте посмотрим на это в действии:

let a = 5;  // 0101 в двоичной записи
let b = 3;  // 0011 в двоичной записи
console.log(a & b);  // 0001 в двоичной записи, что равно 1 в десятичной записи

В этом примере мы сравниваем 5 (0101) и 3 (0011) бит за битом. Только правый бит равен 1 в обоих числах, поэтому это единственный бит, который проходит. Результат - 0001, что равно 1 в десятичной записи.

JavaScript Битовый оператор OR (|)

Битовый оператор OR похож на более lenient охранника. Если один из входов равен 1, он пропускает его. Давайте посмотрим, как это работает:

let a = 5;  // 0101 в двоичной записи
let b = 3;  // 0011 в двоичной записи
console.log(a | b);  // 0111 в двоичной записи, что равно 7 в десятичной записи

Здесь мы получаем 1 wherevereither 5 или 3 имеет 1, что приводит к 0111, что равно 7 в десятичной записи.

JavaScript Битовый оператор XOR (^)

Оператор XOR похож на странную party game, где вы можете войти только если надеваете шляпу или шарф, но не оба! Он возвращает 1 только если биты различаются. Проверьте это:

let a = 5;  // 0101 в двоичной записи
let b = 3;  // 0011 в двоичной записи
console.log(a ^ b);  // 0110 в двоичной записи, что равно 6 в десятичной записи

Мы получаем 1, где биты различаются (второй и третий справа), что приводит к 0110, или 6 в десятичной записи.

JavaScript Битовый оператор NOT (~)

Оператор NOT похож на opposite day - он переворачивает все биты. Но есть один нюанс! В JavaScript он также инвертирует знак и вычитает 1. Давайте посмотрим:

let a = 5;  // 0101 в двоичной записи
console.log(~a);  // -6 в десятичной записи

Результат может удивить вас! Это потому, что JavaScript использует дополнение по модулю 2 для отрицательных чисел. Так что ~5 на самом деле -6.

Битовый оператор Сдвиг влево (<<)

Оператор Сдвиг влево похож на conveyer belt, который перемещает биты влево и добавляет нули справа. Каждый сдвиг эффективно удваивает число:

let a = 5;  // 0101 в двоичной записи
console.log(a << 1);  // 1010 в двоичной записи, что равно 10 в десятичной записи
console.log(a << 2);  // 10100 в двоичной записи, что равно 20 в десятичной записи

Смотрите, как 5 становится 10 с одним сдвигом, и 20 с двумя сдвигами? Это как магия!

Битовый оператор Сдвиг вправо (>>)

Оператор Сдвиг вправо делает обратное, перемещая биты вправо. Он эффективно halved число (округляя вниз):

let a = 5;  // 0101 в двоичной записи
console.log(a >> 1);  // 0010 в двоичной записи, что равно 2 в десятичной записи

5 разделено на 2 равно 2.5, но мы округляем вниз до 2.

Битовый оператор Сдвиг вправо с заполнением нулями (>>:]

Этот оператор аналогичен >>, но он всегда заполняет нулями слева, даже для отрицательных чисел:

let a = -5;  // 11111111111111111111111111111011 в двоичной записи (32-бит)
console.log(a >>> 1);  // 01111111111111111111111111111101 в двоичной записи, что равно 2147483645 в десятичной записи

Этот оператор немного tricky! Он в основном используется, когда вам нужно treat число как беззнаковое.

И вот оно, ребята! Вы только что сделали свои первые шаги в мир битовых операций. Эти операторы могут показаться немного abstract сейчас, но они incredibly полезны для задач, таких как работа с двоичными данными, создание хэш-функций или оптимизация определенных алгоритмов.

Помните, что практика делает perfect. Попробуйте поиграть с этими операторами, и скоро вы будете bite через биты как профи! Счастливого кодирования и пусть биты будут с вами!

Credits: Image by storyset