Побитовые операторы Эти операторы редко используются при написании скриптов, но знать о них всё же стоит. Кто знает, какие задачи вам придётся решать с помощью js. Чтобы понять, как работают побитовые операторы, нам придётся научиться переводить их операнды в двоичную систему счисления. Чтобы перевести число в двоичную систему счисления необходимо делить его нацело на 2 пока не получится 0, запоминая остатки от деления, затем записать их в обратном порядке. Например («/» означает деление нацело): 30 / 2 = 15 остаток 0 15 / 2 = 7 остаток 1 7 / 2 = 3 остаток 1 3 / 2 = 1 остаток 1 1 / 2 = 0 остаток (обратите внимание!) 1 А теперь записываем остатки от деления, собирая их снизу вверх. Получаем, что 30 в двоичном представлении будет выглядеть как 11110. Чтобы поставить знак равенства между числами в разных системах счисления, обычно в индексах у них пишут основание системы счисления, в которой они записаны. 3010 = 111102 Нам также полезно будет знать, как переводить числа назад из двоичной в десятичную систему счисления. Осуществить подобную операцию можно по формуле: a = a0 * 20 + a1 * 21 + a2 * 22 + … + an * 2n Где а – число в десятичной системе счисления; a0, a1, ... an – цифры этого числа в двоичном представлении. Причём a0 — это последняя цифра, а an– первая. Например, переведём число 1010012 в десятичную систему счисления. 1010012 = 1 * 20 + 0 * 21 + 0 * 22 + 1 * 23 + 0 * 24 + 1 * 25 = 1 + 8 + 32 = 4110 Теперь у вас достаточно знаний для того, чтобы понять, как работают побитовые операторы. Рассмотрим оператор побитовое «или» ( | ). Этот оператор производит операцию логического «или» над соответствующими битами (разрядами в двоичном представлении операндов), помещая результат в соответствующий разряд двоичного представления результата. При этом значению true соответствует 1, false – 0. Например: 7 | 9; // вернёт 15 7 имеет двоичное представление 111, а 9 – 1001. Запишем эти двоичные значения друг под другом (доставим при этом перед 111 ноль, чтобы сравнять их длину) выполним операции логического «или» над разрядами, которые находятся друг под другом, и запишем результат под ними. 0111 1001 1111 1111 это двоичное представление числа 15 Теперь рассмотрим побитовое «и». Оно работает аналогично, только над битами операндов производится операция логического и 6 & 5; // 4 610 = 1102, 510 = 1012 110 101 100 1002 = 410 Есть и ещё операция побитового отрицания (~) она заменяет в двоичном представлении операнда 0 на 1, а 1 на 0. Так как первый бит у числа знаковый, то знак у результата будет противоположным знаку операнда. Фактически этот операнд работает как выражение –n – 1. ~-1; // 0 ~2; // -3 Теперь ознакомимся с такой побитовой операцией как xor или «исключающие или». Это операция ставит в соответствующую позицию результата в двоичном представлении 0, если биты на соответствующих позициях в операндах одинаковы, и 0 в противном случае. В js это операция может быть выполнена при помощи символа «^». Например, поксорим 6 на 8. 610 = 01102 810 = 10002 0110 1000 1110 11102 = 1410 var a = 6, b = 8; console.log(a ^ b); // 14 Битовые сдвиги При выполнении этого типа логических операций биты числа сдвигаются либо вправо (>>), либо влево (<<) на заданное количество позиций. При этом первый (последний) бит может стать последним (первым). Например, выполним операцию 5 << 3 т.е сдвинем биты пятёрки на при позиции влево. Итак, переведём 5 в двоичную систему счисления 510 = 1012 и переместим полученное значения на 3 позиции влево, при этом справа появятся нули. Получим 1010002 = 4010. 5 << 3 // = 40 Аналогично для сдвигов вправо. Выполним, например операции 40 >> 2. 4010 = 1010002. После сдвига на 2 позиции вправо получим 10102 = 1010 40 >> 2 // = 10