0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#База знаний</a></p>
1
<p><a>#База знаний</a></p>
2
<ul><li>9 мар 2021</li>
2
<ul><li>9 мар 2021</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Знакомимся с каждым, узнаём про короткую и полную схемы вычислений. Проводим побитовые операции с целыми числами. Всё закрепляем на примерах.</p>
4
</ul><p>Знакомимся с каждым, узнаём про короткую и полную схемы вычислений. Проводим побитовые операции с целыми числами. Всё закрепляем на примерах.</p>
5
<p>Java-разработчик, преподаёт в Skillbox, осваивает машинное обучение.</p>
5
<p>Java-разработчик, преподаёт в Skillbox, осваивает машинное обучение.</p>
6
<p>Логические операции в Java возвращают значение типа boolean: true или false ("правда" или "ложь"). Подробнее о булевом типе мы говорили<a>здесь</a>.</p>
6
<p>Логические операции в Java возвращают значение типа boolean: true или false ("правда" или "ложь"). Подробнее о булевом типе мы говорили<a>здесь</a>.</p>
7
<p>В языке Java есть шесть логических операторов. Первые четыре представлены в таблице ниже.</p>
7
<p>В языке Java есть шесть логических операторов. Первые четыре представлены в таблице ниже.</p>
8
<strong>Логический оператор</strong><strong>Обозначение в</strong> <strong>Java</strong><strong>Выражение</strong><strong>Результат</strong>"И" (AND): конъюнкция, логическое умножение&&true && true<p>false && false</p>
8
<strong>Логический оператор</strong><strong>Обозначение в</strong> <strong>Java</strong><strong>Выражение</strong><strong>Результат</strong>"И" (AND): конъюнкция, логическое умножение&&true && true<p>false && false</p>
9
<p>true && false</p>
9
<p>true && false</p>
10
<p>false && true</p>
10
<p>false && true</p>
11
true<p>false</p>
11
true<p>false</p>
12
<p>false</p>
12
<p>false</p>
13
<p>false</p>
13
<p>false</p>
14
Включающее "ИЛИ" (OR): дизъюнкция, логическое сложение||true || true<p>false || false</p>
14
Включающее "ИЛИ" (OR): дизъюнкция, логическое сложение||true || true<p>false || false</p>
15
<p>true || false</p>
15
<p>true || false</p>
16
<p>false || true</p>
16
<p>false || true</p>
17
true<p>false</p>
17
true<p>false</p>
18
<p>true</p>
18
<p>true</p>
19
<p>true</p>
19
<p>true</p>
20
Исключающее "ИЛИ" (XOR): строгая дизъюнкция, логическое вычитание^true ^ true<p>false ^ false</p>
20
Исключающее "ИЛИ" (XOR): строгая дизъюнкция, логическое вычитание^true ^ true<p>false ^ false</p>
21
<p>true ^ false</p>
21
<p>true ^ false</p>
22
<p>false ^ true</p>
22
<p>false ^ true</p>
23
false<p>false</p>
23
false<p>false</p>
24
<p>true</p>
24
<p>true</p>
25
<p>true</p>
25
<p>true</p>
26
"НЕ" (NOT): инверсия, отрицание!!true<p>!false</p>
26
"НЕ" (NOT): инверсия, отрицание!!true<p>!false</p>
27
false<p>true</p>
27
false<p>true</p>
28
<p>Если коротко, то в условных выражениях, которые могут включать в себя и операторы сравнения (<, >, <=, >=, ==, !=). При вычислении они возвращают значение булева типа.</p>
28
<p>Если коротко, то в условных выражениях, которые могут включать в себя и операторы сравнения (<, >, <=, >=, ==, !=). При вычислении они возвращают значение булева типа.</p>
29
<p>Условные выражения, в свою очередь, применяются в операторах ветвления (if-else, switch, тернарном). Подробнее об этих операторах<a>тут</a>.</p>
29
<p>Условные выражения, в свою очередь, применяются в операторах ветвления (if-else, switch, тернарном). Подробнее об этих операторах<a>тут</a>.</p>
30
<p>Допустим, мы хотим проверить, что значение переменной a больше значений в переменных b и c. То есть сравнить операнд a с двумя другими. Нам поможет логический оператор && (И).</p>
30
<p>Допустим, мы хотим проверить, что значение переменной a больше значений в переменных b и c. То есть сравнить операнд a с двумя другими. Нам поможет логический оператор && (И).</p>
31
<p>Логический оператор && (И) возвращает true, если слева и справа от него стоят значения true, а иначе - false.</p>
31
<p>Логический оператор && (И) возвращает true, если слева и справа от него стоят значения true, а иначе - false.</p>
32
<p>Иными словами, если оба логических высказывания истинны, то и операция && (И) возвращает истину.</p>
32
<p>Иными словами, если оба логических высказывания истинны, то и операция && (И) возвращает истину.</p>
33
<p>Первый пример</p>
33
<p>Первый пример</p>
34
int a = 6; int b = 3; int c = 4; boolean d = (a > b) && (a > c); System.out.println(d); --OUTPUT> true<p>Как вычисляется значение выражения (a > b) && (a > c):</p>
34
int a = 6; int b = 3; int c = 4; boolean d = (a > b) && (a > c); System.out.println(d); --OUTPUT> true<p>Как вычисляется значение выражения (a > b) && (a > c):</p>
35
<p>Сначала проверяется условие (a > b). Оно вернёт true, так как 6 больше 4. Далее проверяется условие (a > c), которое также вернёт true, ведь 6 больше 3.</p>
35
<p>Сначала проверяется условие (a > b). Оно вернёт true, так как 6 больше 4. Далее проверяется условие (a > c), которое также вернёт true, ведь 6 больше 3.</p>
36
<p>Теперь у нас с двух сторон от логического оператора && стоят значения true.</p>
36
<p>Теперь у нас с двух сторон от логического оператора && стоят значения true.</p>
37
<p>По определению выше или по таблице ещё выше, результат вычисления логического выражения (true && true) равен true.</p>
37
<p>По определению выше или по таблице ещё выше, результат вычисления логического выражения (true && true) равен true.</p>
38
<p>Второй пример</p>
38
<p>Второй пример</p>
39
int a = 6; int b = 4; int c = 7; boolean d = (a > b) && (a > c); System.out.println(d); --OUTPUT> false<p>Результат операции (a > b) вернёт true, так как 6 больше 4, а операция (a > c) уже вернёт false, так как 6 не больше 7.</p>
39
int a = 6; int b = 4; int c = 7; boolean d = (a > b) && (a > c); System.out.println(d); --OUTPUT> false<p>Результат операции (a > b) вернёт true, так как 6 больше 4, а операция (a > c) уже вернёт false, так как 6 не больше 7.</p>
40
<p>Значит, слева от логического оператора && стоит true, а справа - false. Следовательно, результат вычисления логического выражения (мы присвоили его булевой переменной d) будет false.</p>
40
<p>Значит, слева от логического оператора && стоит true, а справа - false. Следовательно, результат вычисления логического выражения (мы присвоили его булевой переменной d) будет false.</p>
41
<p>Третий пример</p>
41
<p>Третий пример</p>
42
int a = 4; int b = 5; int c = 6; boolean d = (a > b) && (a > c); System.out.println(d); --OUTPUT> false<p>Результат операции сравнения (a > b) равен false, а что вернёт операция (a > c), уже значения не имеет (смотрите определение выше) - результат вычисления логического выражения (мы присвоили его булевой переменной d) будет равен false.</p>
42
int a = 4; int b = 5; int c = 6; boolean d = (a > b) && (a > c); System.out.println(d); --OUTPUT> false<p>Результат операции сравнения (a > b) равен false, а что вернёт операция (a > c), уже значения не имеет (смотрите определение выше) - результат вычисления логического выражения (мы присвоили его булевой переменной d) будет равен false.</p>
43
<p>Рассмотрим примеры с другими операторами.</p>
43
<p>Рассмотрим примеры с другими операторами.</p>
44
int a = 4; int b = 6; int c = 3; boolean d = (a > b) || (a > c); System.out.println(d); --OUTPUT> true<p>Порядок вычисления:</p>
44
int a = 4; int b = 6; int c = 3; boolean d = (a > b) || (a > c); System.out.println(d); --OUTPUT> true<p>Порядок вычисления:</p>
45
<ul><li>(a > b) || (a > c)</li>
45
<ul><li>(a > b) || (a > c)</li>
46
<li><strong>(4 > 6)</strong>|| (4 > 3)</li>
46
<li><strong>(4 > 6)</strong>|| (4 > 3)</li>
47
<li>false ||<strong>(4 > 3)</strong></li>
47
<li>false ||<strong>(4 > 3)</strong></li>
48
<li><strong>false || true</strong></li>
48
<li><strong>false || true</strong></li>
49
<li>true</li>
49
<li>true</li>
50
</ul><p>Значение переменной d равно true.</p>
50
</ul><p>Значение переменной d равно true.</p>
51
int a = 9; int b = 9; boolean c = a > b || a != b; System.out.println(c); --OUTPUT> false<p>Теперь вычисляйте вы.</p>
51
int a = 9; int b = 9; boolean c = a > b || a != b; System.out.println(c); --OUTPUT> false<p>Теперь вычисляйте вы.</p>
52
int a = 5; int b = 6; int c = 7; boolean d = (b > a) ^ (c > a); System.out.println(d); --OUTPUT> false<p>Порядок вычисления:</p>
52
int a = 5; int b = 6; int c = 7; boolean d = (b > a) ^ (c > a); System.out.println(d); --OUTPUT> false<p>Порядок вычисления:</p>
53
<ul><li>(b > a) ^ (c > a)</li>
53
<ul><li>(b > a) ^ (c > a)</li>
54
<li><strong>(6 > 5)</strong>^ (7 > 5)</li>
54
<li><strong>(6 > 5)</strong>^ (7 > 5)</li>
55
<li>true ^<strong>(7 > 5)</strong></li>
55
<li>true ^<strong>(7 > 5)</strong></li>
56
<li><strong>true ^ true</strong></li>
56
<li><strong>true ^ true</strong></li>
57
<li>false</li>
57
<li>false</li>
58
</ul><p>Значение d равно false.</p>
58
</ul><p>Значение d равно false.</p>
59
int a = 5; int b = 9; boolean d = !(a > b); System.out.println(d); --OUTPUT> true<p>Порядок вычисления:</p>
59
int a = 5; int b = 9; boolean d = !(a > b); System.out.println(d); --OUTPUT> true<p>Порядок вычисления:</p>
60
<ul><li>!(a > b)</li>
60
<ul><li>!(a > b)</li>
61
<li>!<strong>(5 > 9)</strong></li>
61
<li>!<strong>(5 > 9)</strong></li>
62
<li><strong>!false</strong></li>
62
<li><strong>!false</strong></li>
63
<li>true</li>
63
<li>true</li>
64
</ul><p>Значение d стало true.</p>
64
</ul><p>Значение d стало true.</p>
65
<p>&& и || называются сокращёнными логическими операторами AND и OR соответственно, или<strong>операторами короткой схемы вычислений</strong>. В спецификации Java их ещё зовут условными. Значения их операндов могут быть только булева типа.</p>
65
<p>&& и || называются сокращёнными логическими операторами AND и OR соответственно, или<strong>операторами короткой схемы вычислений</strong>. В спецификации Java их ещё зовут условными. Значения их операндов могут быть только булева типа.</p>
66
<p>В отличие от двойных, одиночные & и | называются<strong>операторами полной схемы вычислений</strong>. Значения их операндов могут быть как только булевыми, так и только целочисленными (вместе с оператором ^ они используются в побитовых операциях).</p>
66
<p>В отличие от двойных, одиночные & и | называются<strong>операторами полной схемы вычислений</strong>. Значения их операндов могут быть как только булевыми, так и только целочисленными (вместе с оператором ^ они используются в побитовых операциях).</p>
67
<p>В том, что для операторов & и | всегда вычисляются значения обоих операндов, а при работе операторов && и || второй операнд вычисляется только по необходимости.</p>
67
<p>В том, что для операторов & и | всегда вычисляются значения обоих операндов, а при работе операторов && и || второй операнд вычисляется только по необходимости.</p>
68
<p>То есть иногда результат выражения однозначно определён уже по первому операнду:</p>
68
<p>То есть иногда результат выражения однозначно определён уже по первому операнду:</p>
69
<ul><li>Если первый операнд && равен false, то второй не вычисляется, так как уже понятно, что результат всего выражения будет false.</li>
69
<ul><li>Если первый операнд && равен false, то второй не вычисляется, так как уже понятно, что результат всего выражения будет false.</li>
70
<li>Если первый операнд || равен true, то второй не вычисляется, так как уже понятно, что || вернёт true.</li>
70
<li>Если первый операнд || равен true, то второй не вычисляется, так как уже понятно, что || вернёт true.</li>
71
</ul><p>&& и || используют как операторы булевой логики. Они оперируют значениями только булева типа и применяются только в логических выражениях.</p>
71
</ul><p>&& и || используют как операторы булевой логики. Они оперируют значениями только булева типа и применяются только в логических выражениях.</p>
72
<p>&& и || позволяют экономить вычисления (применять короткую схему) и помогают избегать ошибок. Как это делается?</p>
72
<p>&& и || позволяют экономить вычисления (применять короткую схему) и помогают избегать ошибок. Как это делается?</p>
73
<p>Начнём с оператора &&. Приведём фрагмент из таблицы выше:</p>
73
<p>Начнём с оператора &&. Приведём фрагмент из таблицы выше:</p>
74
Логический операторОбозначение в JavaВыражениеРезультат"И" (AND): конъюнкция, логическое умножение&&true && true<p>false && false</p>
74
Логический операторОбозначение в JavaВыражениеРезультат"И" (AND): конъюнкция, логическое умножение&&true && true<p>false && false</p>
75
<p>true && false</p>
75
<p>true && false</p>
76
<p>false && true</p>
76
<p>false && true</p>
77
true<p>false</p>
77
true<p>false</p>
78
<p>false</p>
78
<p>false</p>
79
<p>false</p>
79
<p>false</p>
80
<p>Рассмотрим выражение:<strong>(3 > 4)</strong>AND (5 > 4)</p>
80
<p>Рассмотрим выражение:<strong>(3 > 4)</strong>AND (5 > 4)</p>
81
<p>Мы видим, что операнд слева от оператора AND равен false. Смотрим на таблицу выше - и понимаем, что вычислять второй операнд бессмысленно, так как оператор AND уже точно вернёт false.</p>
81
<p>Мы видим, что операнд слева от оператора AND равен false. Смотрим на таблицу выше - и понимаем, что вычислять второй операнд бессмысленно, так как оператор AND уже точно вернёт false.</p>
82
<p>Именно по такой логике и работает оператор короткой схемы вычислений &&. Если выражение слева от него равно false, то выражение справа вычисляться не будет.</p>
82
<p>Именно по такой логике и работает оператор короткой схемы вычислений &&. Если выражение слева от него равно false, то выражение справа вычисляться не будет.</p>
83
<p>Так же и с оператором ||: если выражение слева от него равно true, то выражение справа не вычисляется, так как результат операции || всё равно будет true.</p>
83
<p>Так же и с оператором ||: если выражение слева от него равно true, то выражение справа не вычисляется, так как результат операции || всё равно будет true.</p>
84
<p>В большинстве случае применяют именно && и ||. При верном использовании они избавляют Java от ненужных вычислений и страхуют от некоторых ошибок.</p>
84
<p>В большинстве случае применяют именно && и ||. При верном использовании они избавляют Java от ненужных вычислений и страхуют от некоторых ошибок.</p>
85
<p>Первый пример</p>
85
<p>Первый пример</p>
86
int a = 3; int b = 0; boolean d = (b != 0) && (a/b > 0); System.out.println(d); --OUTPUT> false<p>Если вместо оператора && мы используем &, то получим ошибку (исключение) java.lang.ArithmeticException: / by zero:</p>
86
int a = 3; int b = 0; boolean d = (b != 0) && (a/b > 0); System.out.println(d); --OUTPUT> false<p>Если вместо оператора && мы используем &, то получим ошибку (исключение) java.lang.ArithmeticException: / by zero:</p>
87
int a = 3; int b = 0; boolean d = (b != 0) & (a/b > 0); System.out.println(d); --OUTPUT> Exception in thread <...> java.lang.ArithmeticException: / by zero at <...><p>Ошибка возникнет тогда, когда Java попытается вычислить второй аргумент логического выражения, если первый равнялся false.</p>
87
int a = 3; int b = 0; boolean d = (b != 0) & (a/b > 0); System.out.println(d); --OUTPUT> Exception in thread <...> java.lang.ArithmeticException: / by zero at <...><p>Ошибка возникнет тогда, когда Java попытается вычислить второй аргумент логического выражения, если первый равнялся false.</p>
88
<p>Иными словами, мы узнали, что b равно 0 (выражение b != 0 вернуло false) - и идём делить на b (делить на ноль), вычисляя значение второго операнда (a/b > 0).</p>
88
<p>Иными словами, мы узнали, что b равно 0 (выражение b != 0 вернуло false) - и идём делить на b (делить на ноль), вычисляя значение второго операнда (a/b > 0).</p>
89
<p>Второй пример</p>
89
<p>Второй пример</p>
90
public void printStringLengthMoreThenZero(String str) { if (str != null && str.length() > 0) { System.out.println(str.length()); } else { System.out.println("Тут нечего считать!"); } }<p>Код выше выводит в консоль длину строки str, в которой есть хотя бы один символ. А если строка пуста или её значение равно null (то есть строковая переменная ни на что не указывает), в консоль выводится сообщение: "Тут нечего считать!"</p>
90
public void printStringLengthMoreThenZero(String str) { if (str != null && str.length() > 0) { System.out.println(str.length()); } else { System.out.println("Тут нечего считать!"); } }<p>Код выше выводит в консоль длину строки str, в которой есть хотя бы один символ. А если строка пуста или её значение равно null (то есть строковая переменная ни на что не указывает), в консоль выводится сообщение: "Тут нечего считать!"</p>
91
<p>Мы выбрали оператор короткой схемы вычислений && - и это правильно!</p>
91
<p>Мы выбрали оператор короткой схемы вычислений && - и это правильно!</p>
92
<p>А вот если бы вместо этого использовали оператор полной схемы &, то наш код работал бы не так, как надо.</p>
92
<p>А вот если бы вместо этого использовали оператор полной схемы &, то наш код работал бы не так, как надо.</p>
93
<p>Мы получали бы ошибку NullPointerException каждый раз, когда вызываем метод для строковой переменной со значением null.</p>
93
<p>Мы получали бы ошибку NullPointerException каждый раз, когда вызываем метод для строковой переменной со значением null.</p>
94
<p>Посмотрим, что происходило бы при вычислении условия блока if:</p>
94
<p>Посмотрим, что происходило бы при вычислении условия блока if:</p>
95
<ul><li>str != null & str.length() > 0</li>
95
<ul><li>str != null & str.length() > 0</li>
96
<li><strong>null != null</strong>& str.length() > 0</li>
96
<li><strong>null != null</strong>& str.length() > 0</li>
97
<li>false &<strong>str.length()</strong>> 0<em>// тут возникает ошибка</em></li>
97
<li>false &<strong>str.length()</strong>> 0<em>// тут возникает ошибка</em></li>
98
</ul><p>Сперва вычисляется первый аргумент логического выражения, а именно str != null (иными словами, получаем ответ на вопрос<em>"Строковая переменная не равна null?"</em>). Получили false, значит всё же равна.</p>
98
</ul><p>Сперва вычисляется первый аргумент логического выражения, а именно str != null (иными словами, получаем ответ на вопрос<em>"Строковая переменная не равна null?"</em>). Получили false, значит всё же равна.</p>
99
<p>Дальше Java должна вычислить второй аргумент логического выражения, а именно str.length() > 0 (иными словами - проверяется<em>"Число символов строки > 0?"</em>).</p>
99
<p>Дальше Java должна вычислить второй аргумент логического выражения, а именно str.length() > 0 (иными словами - проверяется<em>"Число символов строки > 0?"</em>).</p>
100
<p>Для этого вызывается метод str.length(), который должен вернуть целое значение. Оно и будет сравниваться с 0. Но у нас-то str равна null (возвращать методу нечего, строки нет). Тут Java и пожалуется на NullPointerException.</p>
100
<p>Для этого вызывается метод str.length(), который должен вернуть целое значение. Оно и будет сравниваться с 0. Но у нас-то str равна null (возвращать методу нечего, строки нет). Тут Java и пожалуется на NullPointerException.</p>
101
<p>Когда в выражении несколько логических операторов, результат вычисляется с учётом их приоритета. Если нет логических скобок, то операции выполняются в таком порядке:</p>
101
<p>Когда в выражении несколько логических операторов, результат вычисляется с учётом их приоритета. Если нет логических скобок, то операции выполняются в таком порядке:</p>
102
<ul><li>! (NOT)</li>
102
<ul><li>! (NOT)</li>
103
<li>& (AND)</li>
103
<li>& (AND)</li>
104
<li>^ (XOR)</li>
104
<li>^ (XOR)</li>
105
<li>| (OR)</li>
105
<li>| (OR)</li>
106
<li>&& (условный AND)</li>
106
<li>&& (условный AND)</li>
107
<li>|| (условный OR)</li>
107
<li>|| (условный OR)</li>
108
</ul><p>Если одинаковые операции стоят по соседству, то раньше выполняется та, что левее.</p>
108
</ul><p>Если одинаковые операции стоят по соседству, то раньше выполняется та, что левее.</p>
109
<p>Первый пример</p>
109
<p>Первый пример</p>
110
boolean a = true ^ true & false; System.out.println(a);<p>Вычислим true ^ true & false:</p>
110
boolean a = true ^ true & false; System.out.println(a);<p>Вычислим true ^ true & false:</p>
111
<ul><li>Выбираем самый приоритетный оператор (если таких больше одного - тот, что левее). У нас самый приоритетный & (он здесь такой один).</li>
111
<ul><li>Выбираем самый приоритетный оператор (если таких больше одного - тот, что левее). У нас самый приоритетный & (он здесь такой один).</li>
112
<li>Смотрим, что слева и справа от него: это<strong>true</strong>и <strong>false</strong>соответственно.</li>
112
<li>Смотрим, что слева и справа от него: это<strong>true</strong>и <strong>false</strong>соответственно.</li>
113
<li>Вычисляем выражение true & false - получаем false.</li>
113
<li>Вычисляем выражение true & false - получаем false.</li>
114
<li>В исходном выражении заменяем true & false результатом его вычисления (false) - и получаем: true ^ false.</li>
114
<li>В исходном выражении заменяем true & false результатом его вычисления (false) - и получаем: true ^ false.</li>
115
<li>Вычислив это выражение, получаем результат true.</li>
115
<li>Вычислив это выражение, получаем результат true.</li>
116
</ul><p>Или короче:</p>
116
</ul><p>Или короче:</p>
117
<ul><li>true ^<strong>true & false</strong></li>
117
<ul><li>true ^<strong>true & false</strong></li>
118
<li><strong>true ^ false</strong></li>
118
<li><strong>true ^ false</strong></li>
119
<li>true</li>
119
<li>true</li>
120
</ul><p>Второй пример</p>
120
</ul><p>Второй пример</p>
121
<p>Заменим & на &&:</p>
121
<p>Заменим & на &&:</p>
122
boolean a = true ^ true && false; System.out.println(a);<p>Теперь самый приоритетный оператор в выражении это ^ - и порядок вычислений будет уже другой:</p>
122
boolean a = true ^ true && false; System.out.println(a);<p>Теперь самый приоритетный оператор в выражении это ^ - и порядок вычислений будет уже другой:</p>
123
<ul><li><strong>true ^ true</strong>&& false</li>
123
<ul><li><strong>true ^ true</strong>&& false</li>
124
<li><strong>false && false</strong></li>
124
<li><strong>false && false</strong></li>
125
<li>false</li>
125
<li>false</li>
126
</ul><p>Результат будет false.</p>
126
</ul><p>Результат будет false.</p>
127
<p>Порядок вычисления логических операторов меняют круглые скобки - так же, как в арифметике:</p>
127
<p>Порядок вычисления логических операторов меняют круглые скобки - так же, как в арифметике:</p>
128
boolean a = (true ^ true) & false; System.out.println(a); --OUTPUT> false<p>Добавив круглые скобки, мы поменяли приоритеты для вычисления. Теперь сперва будет определено выражение (true ^ true), которое вернёт false. А после - вычислится выражение false & false, которое тоже вернёт false.</p>
128
boolean a = (true ^ true) & false; System.out.println(a); --OUTPUT> false<p>Добавив круглые скобки, мы поменяли приоритеты для вычисления. Теперь сперва будет определено выражение (true ^ true), которое вернёт false. А после - вычислится выражение false & false, которое тоже вернёт false.</p>
129
<p>То есть скобки повышают приоритет стоящего внутри выражения, а внутри самих скобок действуют прежние приоритеты.</p>
129
<p>То есть скобки повышают приоритет стоящего внутри выражения, а внутри самих скобок действуют прежние приоритеты.</p>
130
<p>Пример посложнее - выражение !(true && (false || true)) ^ !false.</p>
130
<p>Пример посложнее - выражение !(true && (false || true)) ^ !false.</p>
131
<p>Порядок вычисления:</p>
131
<p>Порядок вычисления:</p>
132
<ul><li>!(true &&<strong>(false || true)</strong>) ^ !false</li>
132
<ul><li>!(true &&<strong>(false || true)</strong>) ^ !false</li>
133
<li>!<strong>(true && true)</strong>^ !false</li>
133
<li>!<strong>(true && true)</strong>^ !false</li>
134
<li><strong>!true</strong>^ !false</li>
134
<li><strong>!true</strong>^ !false</li>
135
<li>false ^<strong>!false</strong></li>
135
<li>false ^<strong>!false</strong></li>
136
<li><strong>false ^ true</strong></li>
136
<li><strong>false ^ true</strong></li>
137
<li>true</li>
137
<li>true</li>
138
</ul><p>Результат: true.</p>
138
</ul><p>Результат: true.</p>
139
<p>Мы уже знаем, что логические операции применимы к логическим аргументам (операндам). Каждый логический операнд - это выражение, которое является истинным (true) или ложным (false) - то есть возвращает булево значение. Иными словами, логический операнд - это выражение типа boolean.</p>
139
<p>Мы уже знаем, что логические операции применимы к логическим аргументам (операндам). Каждый логический операнд - это выражение, которое является истинным (true) или ложным (false) - то есть возвращает булево значение. Иными словами, логический операнд - это выражение типа boolean.</p>
140
<p><em><strong>Выходит, применять логические операторы к целочисленным аргументам нельзя?</strong></em></p>
140
<p><em><strong>Выходит, применять логические операторы к целочисленным аргументам нельзя?</strong></em></p>
141
<p><em><strong>Можно.</strong></em>Внутри Java все целочисленные типы представлены<a>двоичными числами</a>разной длины. И к ним уже применимы бинарные логические операторы ^, | и &.</p>
141
<p><em><strong>Можно.</strong></em>Внутри Java все целочисленные типы представлены<a>двоичными числами</a>разной длины. И к ним уже применимы бинарные логические операторы ^, | и &.</p>
142
<p>Только в этом случае они работают с двоичным представлением операндов - выполняют операции над их битами попарно (рассматривая их как логические единицы и нули). Поэтому и сами операторы ^, | и & зовутся<em>побитовыми</em>.</p>
142
<p>Только в этом случае они работают с двоичным представлением операндов - выполняют операции над их битами попарно (рассматривая их как логические единицы и нули). Поэтому и сами операторы ^, | и & зовутся<em>побитовыми</em>.</p>
143
<p>Рассмотрим пример:</p>
143
<p>Рассмотрим пример:</p>
144
int a = 3 & 5; int b = 3 | 5; int c = 3 ^ 5; System.out.println(a); System.out.println(b); System.out.println(c); --OUTPUT> 1 --OUTPUT> 7 --OUTPUT> 6<p>Чтобы повторить вычисления Java, нужно:</p>
144
int a = 3 & 5; int b = 3 | 5; int c = 3 ^ 5; System.out.println(a); System.out.println(b); System.out.println(c); --OUTPUT> 1 --OUTPUT> 7 --OUTPUT> 6<p>Чтобы повторить вычисления Java, нужно:</p>
145
<ul><li>Перевести значения обоих операндов в двоичную систему счисления.</li>
145
<ul><li>Перевести значения обоих операндов в двоичную систему счисления.</li>
146
<li>Расположить результаты перевода друг под другом.</li>
146
<li>Расположить результаты перевода друг под другом.</li>
147
<li>Сравнять в них число разрядов (дополнить лидирующими нулями).</li>
147
<li>Сравнять в них число разрядов (дополнить лидирующими нулями).</li>
148
<li>Применить к битам из каждого столбца оператор (&, | или ^).</li>
148
<li>Применить к битам из каждого столбца оператор (&, | или ^).</li>
149
<li>Записать результат каждой операции ниже в том же столбце.</li>
149
<li>Записать результат каждой операции ниже в том же столбце.</li>
150
<li>Перевести итог в десятичную форму.</li>
150
<li>Перевести итог в десятичную форму.</li>
151
</ul><p>Число 3 в двоичной системе счисления имеет вид 11, а число 5 - 101.</p>
151
</ul><p>Число 3 в двоичной системе счисления имеет вид 11, а число 5 - 101.</p>
152
<p>Так как у числа 5 три разряда в двоичной системе, а у числа 3 - всего два, добавим лидирующий ноль к числу 3 в двоичной системе и получим 011.</p>
152
<p>Так как у числа 5 три разряда в двоичной системе, а у числа 3 - всего два, добавим лидирующий ноль к числу 3 в двоичной системе и получим 011.</p>
153
<p>Берём цифры из обоих чисел и применяем к ним попарно оператор & (AND):</p>
153
<p>Берём цифры из обоих чисел и применяем к ним попарно оператор & (AND):</p>
154
3(10) = 011(2)011&&&5(10) = 101(2)101===001(2) = 1(10)001<p>Получаем число 001. В десятичной записи ему соответствует число 1. Поэтому операция 3 & 5 и возвращает в результате 1.</p>
154
3(10) = 011(2)011&&&5(10) = 101(2)101===001(2) = 1(10)001<p>Получаем число 001. В десятичной записи ему соответствует число 1. Поэтому операция 3 & 5 и возвращает в результате 1.</p>
155
<p>С оператором | действуем так же:</p>
155
<p>С оператором | действуем так же:</p>
156
3(10) = 011(2)011|||5(10) = 101(2)101===111(2) = 7(10)1113(10) = 011(2)011^^^5(10) = 101(2)101===110(2) = 6(10)110<p>Сперва подытожим:</p>
156
3(10) = 011(2)011|||5(10) = 101(2)101===111(2) = 7(10)1113(10) = 011(2)011^^^5(10) = 101(2)101===110(2) = 6(10)110<p>Сперва подытожим:</p>
157
<ul><li>мы познакомились с логическими операторами в Java;</li>
157
<ul><li>мы познакомились с логическими операторами в Java;</li>
158
<li>научились вычислять условные выражения с ними;</li>
158
<li>научились вычислять условные выражения с ними;</li>
159
<li>разобрались, как они работают с целыми числами.</li>
159
<li>разобрались, как они работают с целыми числами.</li>
160
</ul><p>В одной из статей мы говорили про операторы сравнения <, >, <=, >=, ==, !=, а также instanceof, про условные конструкции if-else и switch. Учились работать с тернарным оператором.</p>
160
</ul><p>В одной из статей мы говорили про операторы сравнения <, >, <=, >=, ==, !=, а также instanceof, про условные конструкции if-else и switch. Учились работать с тернарным оператором.</p>
161
<p>Если пропустили - лучше<a>вернитесь и прочтите</a>.</p>
161
<p>Если пропустили - лучше<a>вернитесь и прочтите</a>.</p>
162
<a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>
162
<a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>