Поразрядные операторы обрабатывают свои операнды как последовательность из 32 бит (нулей и единиц), а не как десятичные, шестнадцатеричные или восьмеричные числа. - developer.mozilla.org

Мне кажется, что разработчик не беспокоится о побитовых операторах. Они остались одни!

В большинстве случаев они не используются, потому что некоторые считают, что все разработчики их недостаточно хорошо знают, и путают их с логическими эквивалентами. Например, предположим, что вы работаете над большим проектом и использовали что-то вроде (a и b), очень велика вероятность, что во время проверки кода кто-то скажет, что вы пропустили «&», и это должно было быть «(a && b) »

Это своего рода причина, по которой их оставляют в покое. И им плохо, у них тоже есть чувства, знаете ли!

Так что, если они будут рассматривать любое число как последовательность из 32 бит, их предубеждение делает их очень быстрыми: P Серьезно !!!

Числа в JavaScript хранятся в 64-битном формате IEEE-754. Для побитовых операций они преобразуются в 32-битное представление со знаком.

Несмотря на это преобразование, предполагается, что побитовые операции выполняются очень быстро.

Прежде чем мы перейдем к побитовым операциям, давайте посмотрим, как увидеть число в двоичном формате?

Метод Number.prototype.toString принимает систему счисления (необязательно), которая представляет собой целое число от 2 до 36, определяющее основу, используемую для представления числовых значений.

Мы можем использовать метод toString (2). Обратите внимание, что мы передаем аргумент 2, что в основном означает возвращаемую строку в двоичном формате.

//See number in binary
var a = 2;
a.toString(2); //this returns string "111"

базовое описание операций следующее:

Поэтому я решил, что давайте проверим это сам. Часто можно увидеть стиль изменения строк для таблиц, где мы даем отдельный стиль для нечетных / четных.

Единственная разница в приведенном ниже коде - вместо «i% 2», я изменил его на «i & 1».

//row alternating example
//Normal way
function usualWay() {
  var evenUsual = 0;
  var oddUsual = 0;
  for (var i=0, len=10000000; i < len; i++) {
    if (i % 2) {
      //"odd"
      oddUsual++;
    } else {
      //"even";
      evenUsual++;
    }
  }
}
function bitWay() {
  var evenBit = 0;
  var oddBit = 0;
  for (var i=0, len=10000000; i < len; i++) {
    if (i & 1) {
      //"odd"
      oddBit++;
    } else {
      //"even"
      evenBit++;
    }
  }
}
usualWay();
bitWay();

Результатом этого было побитовое выполнение - намного быстрее для очень больших входных данных (итераций), но по мере того, как количество итераций уменьшалось, разница была очень небольшой, и это заставляет вас думать, стоит ли оно того?

Лично я бы не стал использовать его, если не выполняю эту операцию тысячи раз. Поскольку некоторые операции не очень интуитивно понятны для чтения и обслуживания.

Где еще я могу их использовать?

  • Битовые поля (флаги)
    Это наиболее эффективный способ представления чего-либо, состояние которого определяется несколькими свойствами «да или нет». ACL - хороший пример; Если у вас есть, скажем, 4 дискретных разрешения (чтение, запись, выполнение, изменение политики), лучше сохранить их в 1 байте, а не тратить 4. Для дополнительного удобства они могут быть сопоставлены с типами перечисления на многих языках.
  • Сжатие, шифрование
    Оба они сильно зависят от побитовых алгоритмов. Взгляните на алгоритм deflate для примера - все в битах, а не в байтах. Посмотрите на реализацию nodeca в github
  • Графика Здесь едва ли хватит места, чтобы разобраться во всех областях, где эти операторы используются в графическом программировании. Функции Javascript для быстрого преобразования цвета в двоичный / шестнадцатеричный / RGB-код с помощью побитовых операций. Https://gist.github.com/lrvick/2080648
  • Бит / байтовый алгоритм сортировки, когда пространство ограничено. Использование битов (или байтов) вместо типов, которые занимают больше памяти, таких как строки, объекты или что-то еще, позволяет нам более эффективно искать, сортировать и хранить данные. Представьте себе битовую / байтовую структуру данных по сравнению с традиционной в отношении сортировки целых чисел, байтовый массив позволил бы нам реализовать Bucket Sort с небольшим потреблением памяти.
Bucket sort works as follows:
1. Set up an array of initially empty “buckets”.
2. Scatter: Go over the original array, putting each object in its bucket.
3. Sort each non-empty bucket.
4. Gather: Visit the buckets in order and put all elements back into the original array.

Это только несколько примеров, которые я добавил сюда, я попытался предоставить ссылку на исходный источник, где это возможно. Пожалуйста, поделись своими мыслями :)