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

advertisement
Побитовые операторы
Эти операторы редко используются при написании скриптов, но знать о них всё же
стоит. Кто знает, какие задачи вам придётся решать с помощью 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
Download