Побитовые операторы в JavaScript работают с 32-битными целыми числами в их двоичном представлении.
Это представление называется «32-битное целое со знаком, старшим битом слева и дополнением до двойки».
Разберём, как устроены числа внутри подробнее, это необходимо знать для битовых операций с ними.
Что такое двоичная система счисления, вам, надеюсь, уже известно. При разборе побитовых операций мы будем обсуждать именно двоичное представление чисел, из 32 бит.
Старший бит слева — это научное название для самого обычного порядка записи цифр (от большего разряда к меньшему). При этом, если больший разряд отсутствует, то соответствующий бит равен нулю.
Примеры представления чисел в двоичной системе:
a = 0; // 00000000000000000000000000000000
a = 1; // 00000000000000000000000000000001
a = 2; // 00000000000000000000000000000010
a = 3; // 00000000000000000000000000000011
a = 255;// 00000000000000000000000011111111
Обратите внимание, каждое число состоит ровно из 32-битов.
Младший бит слева
Несмотря на то, что нам такой способ записи чисел кажется совсем обычным, бывают языки и технологии, использующие способ записи «младший бит слева», когда биты пишутся наоборот, от меньшего разряда к большему.
Именно поэтому спецификация EcmaScript явно говорит «старший бит слева».
Дополнение до двойки — это название способа поддержки отрицательных чисел.
Двоичный вид числа, обратного данному (например,5и-5) получается путём обращения всех битов с прибавлением 1.
То есть, нули заменяются на единицы, единицы — на нули и к числу прибавляется 1. Получается внутреннее представление того же числа, но со знаком минус.
Например, вот число 314:
Чтобы получить -314, первый шаг — обратить биты числа: заменить 0 на 1, а 1 на 0:
Второй шаг — к полученному двоичному числу приплюсовать единицу, обычным двоичным сложением: 11111111111111111111111011000101 + 1 = 11111111111111111111111011000110.
Итак, мы получили:
-314 = 11111111111111111111111011000110
Принцип дополнения до двойки делит все двоичные представления на два множества: если крайний-левый бит равен 0 — число положительное, если 1 — число отрицательное. Поэтому этот бит называется знаковым битом.