JS для начинающих. Урок 1.8: Логические и побитовые операторы

Логические операторы

Логические операторы, так же как и арифметические могут быть бинарными и унарными, но в отличие от арифметических возвращённое ими значение чаще всего рассматривается как логическое.

Замечание:
Обратите внимание на то, что в js значение, возвращаемое логическими операторами, не всегда имеет логический тип (равно true или false). В этом уроке мы рассмотрим только те случаи, когда возвращаемое значение имеет логический тип.

Оператор отрицания

Единственной унарным логическим оператором является оператор отрицания (!). Применённый к переменной, содержащей значение true, он возвращает false, и наоборот.

var a = true;
alert(!a); // покажет в сером унылом окошке false
a = !a;
alert(a); // снова false

Напоминаю, что для ваших экспериментов с js идеально подходит консоль. Если убрать из предыдущих примеров функция alert, то можно построчно вводить их в консоль и наблюдать за значением, которое возвращает вводимая вами строка.

Операторы равенства и неравенства

Здесь мы рассмотрим только оператор == и случай, когда оба операнда имеют одинаковый тип и являются строками, числами или логическими значениями. Существует ещё и оператор ===, и операнды у операторов == и === могут иметь различные типы, но об этом мы поговорим позже.

Итак, оператор == сравнивает два значения и возвращает true, если они равны и false, если нет.

var a = 123, b = 123
a == b; // вернёт true
 
a = 321;
a == b; // false
a = b;
 
a == b; // снова true

С текстовыми значениями абсолютно так же.

var str1 = "string", str2 = "string";
 
str1 == str2; // true
str1 == 'another string'; // false

Оператор неравенства (!=) возвращает значение противоположное тому, которое вернул бы оператор равенства.

var a = 123, b = 123
a != b; // вернёт false
 
a = 321;
a != b; // true
a = b;
 
a != b; // сново false

Операторы сравнивания

Эти операторы служат для сравнивания чисел, но в js их можно использовать для сравнивания абсолютно чего угодно, при этом, правда, вряд ли можно будет назвать результат осмысленным, так как неизвестно что больше килограмм или метр.
Операторы сравнивания это бинарные операторы «больше» и «меньше» («>»,«<») и «больше или равно», «меньше или равно» («>=»,«<=»). Оператор «больше» возвращает true когда левый операнд больше правого и false в противном случае. Оператор «меньше» работает наоборот. Оператор «больше или равно» возвращает true когда левый операнд больше или равен правому и false в противном случае. Оператор меньше или равно работает наоборот.

var a = -1, b = 2;
 
console.log(a < b); // true
console.log(a > b); // false
console.log(a <= b); // true
console.log(a >= b); // false
 
a = 2;
b = 2;
 
console.log(a <= b); // true
console.log(a >= b); // true

Логическое «или» и логическое «и»

Оператор логическое «или» выглядит, как || и возвращает true тогда и только тогда, когда хотя бы один из операндов равен true.

var a = true, b = false;
 
a || b; // true
a = b;
a || b; // false
 
a = true;
b = true;
 
a || b; // true;

Оператор логическое «и» (&&) возвращает true тогда и только тогда, когда оба его операнда равны true.

var a = true, b = true;
 
a && b; // true
a = false;
a && b; // false
 
b = false;
 
a && b; // false;

Приоритеты логических операций

Аналогично арифметическим операторам, некоторые логические операторы имеют приоритет над другими, то есть выполняются раньше. Чтобы запомнить, что выполняется раньше, логическое «или» (||) или логическое «и» (&&), можно сопоставить оператору || сложение, а оператору && умножение. Действительно, в этом есть смысл, если считать что истина (true) это 1, a ложь (false) это 0, то 1 || 0 = 1 = 1 + 0, 0 || 0 = 0 = 0 + 0, 1 && 0 = 0 = 1 * 0, 0 && 0 = 0 = 0 * 0, 1 && 1 = 1 = 1 * 1. Единственный нюанс это что 1 || 1 = 1 так как третьего логического значения (2) нет.

У сложения, которое мы сравнили с оператором (||) приоритет ниже, чем у умножения, которое мы сравниваем с оператором &&, поэтому && выполняется раньше чем ||. Для того, чтобы установить другой порядок выполнения логических операций используйте скобки. Пример:

var a = true, b = false;  
a || b && b; // true
(a || b) && b; // false

В первом логическом выражении оператор && выполнился раньше, чем ||. Во втором выражении — наоборот.

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

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

Вот и всё, что я хотел вам сегодня рассказать про логические и побитовые операторы. Не отчаивайтесь, если что-то кажется вам сложным или непонятным. Иногда понимание приходит со временем и некоторые вещи можно пока и не понимать. К тому же, вряд ли вам понадобятся те же побитовые операции при написании реальных скриптов.

Успехов вам!

  • Почему jqery так упорно не дружит с utf-8, есть какие нить решения?

  • Stepson, с чего вы взяли, что jquery не дружит с utf-8? Возможно, у вас проблемы с кодировкой при использовании ajax’a.

  • Надежда

    а когда продолжение будет?

  • Надежда, возможно ближе к середине июля. Не теряйте надежду.

  • Марина

    ««исключающие или». Это операция ставит в соответствующую позицию результата в двоичном представлении 0, если биты на соответствующих позициях в операндах одинаковы, и 0 в противном случае.» — опечатка. Если одинаковые — 0, разные — 1.