Учебник по JS

ГЛАВНАЯ JS Введение JS Куда Вывод JS Заявления JS JS-синтаксис JS-комментарии JS-переменные JS Пусть Константа JS JS-операторы JS-арифметика Назначение JS JS-типы данных JS-функции JS-объекты JS-события JS-строки Строковые методы JS Поиск строки JS Шаблоны строк JS JS-номера Методы номеров JS JS-массивы Методы массива JS Сортировка массива JS Итерация массива JS Константа массива JS JS-даты Форматы даты JS Методы получения даты JS Методы установки даты JS JS-математика JS Случайный JS Булевы значения Сравнение JS JS-условия JS-переключатель JS цикл для Цикл JS для входа Цикл JS для Цикл JS во время Перерыв JS JS-итерации JS-наборы JS-карты JS Typeof Преобразование типов JS JS побитовый JS регулярное выражение JS-ошибки Область JS JS-подъем Строгий режим JS JS это ключевое слово Функция стрелки JS JS-классы JS JSON JS-отладка Руководство по стилю JS Лучшие практики JS JS-ошибки JS-производительность Зарезервированные слова JS

JS-версии

JS-версии JS 2009 (ES5) JS 2015 (ES6) JS 2016 JS 2017 JS 2018 JS IE/пограничный История JS

JS-объекты

Определения объектов Свойства объекта Методы объекта Отображение объекта Средства доступа к объектам Конструкторы объектов Прототипы объектов Итерации объектов Наборы объектов Карты объектов Ссылка на объект

JS-функции

Определения функций Параметры функции Вызов функции Вызов функции Функция Применить Закрытие функций

JS-классы

Введение в класс Наследование классов Статический класс

JS асинхронный

Обратные вызовы JS JS асинхронный JS-обещания JS асинхронный/ожидание

JS HTML DOM

Дом Введение DOM-методы Документ DOM DOM-элементы DOM HTML DOM-формы ДОМ CSS DOM-анимации События ДОМ Слушатель событий DOM DOM-навигация DOM-узлы Коллекции DOM Списки узлов DOM

Спецификация браузера JS

JS-окно JS-экран Местоположение JS История JS JS-навигатор Всплывающее оповещение JS JS Тайминг JS-куки

JS-веб-API

Введение в веб-API API веб-форм API истории веб-поиска API веб-хранилища API веб-работника API веб-выборки API веб-геолокации

JS АЯКС

Введение в АЯКС AJAX XMLHttp АЯКС-запрос AJAX-ответ XML-файл AJAX АЯКС PHP АЯКС АСП База данных AJAX AJAX-приложения Примеры AJAX

JS JSON

Введение в JSON Синтаксис JSON JSON против XML Типы данных JSON Анализ JSON Строковая JSON JSON-объекты JSON-массивы JSON-сервер JSON PHP JSON HTML JSON JSONP

JS против JQuery

Селекторы jQuery JQuery HTML jQuery CSS JQuery DOM

JS-графика

JS-графика JS Холст JS сюжет JS Chart.js JS Google Диаграмма JS D3.js

JS-примеры

JS-примеры JS HTML DOM JS HTML-ввод HTML-объекты JS HTML-события JS JS-браузер JS-редактор JS-упражнения JS-викторина JS-сертификат

JS-ссылки

Объекты JavaScript HTML DOM-объекты


Побитовые операции JavaScript


Побитовые операторы JavaScript

Operator Name Description
& AND Sets each bit to 1 if both bits are 1
| OR Sets each bit to 1 if one of two bits is 1
^ XOR Sets each bit to 1 if only one of two bits is 1
~ NOT Inverts all the bits
<< Zero fill left shift Shifts left by pushing zeros in from the right and let the leftmost bits fall off
>> Signed right shift Shifts right by pushing copies of the leftmost bit in from the left, and let the rightmost bits fall off
>>> Zero fill right shift Shifts right by pushing zeros in from the left, and let the rightmost bits fall off

Примеры

Operation Result Same as Result
5 & 1 1 0101 & 0001  0001
5 | 1 5 0101 | 0001  0101
~ 5 10  ~0101  1010
5 << 1 10 0101 << 1  1010
5 ^ 1 4 0101 ^ 0001  0100
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-битные целые числа со знаком, он не вернет 10. Он вернет -6.

00000000000000000000000000000101 (5)

11111111111111111111111111111010 (~5 = -6)

Целое число со знаком использует крайний левый бит в качестве знака минус.



Побитовое И

Когда к паре битов применяется побитовое И, возвращается 1, если оба бита равны 1.

Один битный пример:
ОперацияРезультат
0 и 00
0 и 10
1 и 00
1 и 11
Пример 4 бит:
ОперацияРезультат
1111 и 00000000
1111 и 00010001
1111 и 00100010
1111 и 01000100

Побитовое ИЛИ

Когда к паре битов применяется побитовое ИЛИ, возвращается 1, если один из битов равен 1:

Один битный пример:
ОперацияРезультат
0 | 00
0 | 1
1 | 01
1 | 11
Пример 4 бит:
ОперацияРезультат
1111 | 00001111
1111 | 00011111
1111 | 00101111
1111 | 01001111

Побитовое исключающее ИЛИ

Когда побитовое XOR выполняется для пары битов, оно возвращает 1, если биты различны:

Один битный пример:
ОперацияРезультат
0 ^ 00
0 ^ 1
1 ^ 01
1 ^ 1
Пример 4 бит:
ОперацияРезультат
1111^00001111
1111^00011110
1111^00101101
1111^01001011

Побитовое И (&) в JavaScript

Побитовое И возвращает 1, только если оба бита равны 1:

ДесятичныйБинарный
5000000000000000000000000000000101
1000000000000000000000000000000001
5 и 100000000000000000000000000000001 (1)

Пример

let x = 5 & 1;

Побитовое ИЛИ в JavaScript (|)

Побитовое ИЛИ возвращает 1, если один из битов равен 1:

ДесятичныйБинарный
5000000000000000000000000000000101
1000000000000000000000000000000001
5 | 100000000000000000000000000000101 (5)

Пример

let x = 5 | 1;

Побитовое исключающее ИЛИ в JavaScript (^)

Побитовое XOR возвращает 1, если биты разные:

ДесятичныйБинарный
5000000000000000000000000000000101
1000000000000000000000000000000001
5 ^ 100000000000000000000000000000100 (4)

Пример

let x = 5 ^ 1;

JavaScript побитовое НЕ (~)

ДесятичныйБинарный
5000000000000000000000000000000101
~511111111111111111111111111111010 (-6)

Пример

let x = ~5;

JavaScript (нулевое заполнение) Побитовый сдвиг влево (<<)

Это нулевой сдвиг влево. Один или несколько нулевых битов вставляются справа, а крайние левые биты отбрасываются:

ДесятичныйБинарный
5000000000000000000000000000000101
5 << 100000000000000000000000000001010 (10)

Пример

let x = 5 << 1;

JavaScript (сохранение знаков) Побитовый сдвиг вправо (>>)

Это знак, сохраняющий правый сдвиг. Копии крайнего левого бита вставляются слева, а крайние правые биты отбрасываются:

ДесятичныйБинарный
-5111111111111111111111111111111011
-5 >> 111111111111111111111111111111101 (-3)

Пример

let x = -5 >> 1;

JavaScript (нулевая заливка) Shift вправо (>>>)

Это смещение вправо с нулевым заполнением. Один или несколько нулевых битов вставляются слева, а крайние правые биты отбрасываются:

ДесятичныйБинарный
5000000000000000000000000000000101
5 >>> 100000000000000000000000000000010 (2)

Пример

let x = 5 >>> 1;

Двоичные числа

Двоичные числа с одним набором битов легко понять:

Двоичное представлениеДесятичное значение
0000000000000000000000000000000011
0000000000000000000000000000000102
0000000000000000000000000000001004
0000000000000000000000000000010008
0000000000000000000000000001000016
0000000000000000000000000010000032
0000000000000000000000000100000064

Установка еще нескольких битов раскрывает двоичный шаблон:

Двоичное представлениеДесятичное значение
0000000000000000000000000000001015 (4 + 1)
0000000000000000000000000000110113 (8 + 4 + 1)
0000000000000000000000000010110145 (32 + 8 + 4 + 1)

Двоичные числа JavaScript хранятся в формате дополнения до двух.

Это означает, что отрицательное число является побитовым НЕ числа плюс 1:

Двоичное представлениеДесятичное значение
0000000000000000000000000000001015
111111111111111111111111111111011-5
0000000000000000000000000000001106
111111111111111111111111111111010-6
0000000000000000000000000010100040
111111111111111111111111111011000-40

Преобразование десятичного числа в двоичное

Пример

function dec2bin(dec){
  return (dec >>> 0).toString(2);
}

Преобразование двоичного в десятичное

Пример

function bin2dec(bin){
  return parseInt(bin, 2).toString(10);
}