HTML Diff
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): конъюнкция, логическое умножение&amp;&amp;true &amp;&amp; true<p>false &amp;&amp; false</p>
8 <strong>Логический оператор</strong><strong>Обозначение в</strong> <strong>Java</strong><strong>Выражение</strong><strong>Результат</strong>"И" (AND): конъюнкция, логическое умножение&amp;&amp;true &amp;&amp; true<p>false &amp;&amp; false</p>
9 <p>true &amp;&amp; false</p>
9 <p>true &amp;&amp; false</p>
10 <p>false &amp;&amp; true</p>
10 <p>false &amp;&amp; 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>Если коротко, то в условных выражениях, которые могут включать в себя и операторы сравнения (&lt;, &gt;, &lt;=, &gt;=, ==, !=). При вычислении они возвращают значение булева типа.</p>
28 <p>Если коротко, то в условных выражениях, которые могут включать в себя и операторы сравнения (&lt;, &gt;, &lt;=, &gt;=, ==, !=). При вычислении они возвращают значение булева типа.</p>
29 <p>Условные выражения, в свою очередь, применяются в операторах ветвления (if-else, switch, тернарном). Подробнее об этих операторах<a>тут</a>.</p>
29 <p>Условные выражения, в свою очередь, применяются в операторах ветвления (if-else, switch, тернарном). Подробнее об этих операторах<a>тут</a>.</p>
30 <p>Допустим, мы хотим проверить, что значение переменной a больше значений в переменных b и c. То есть сравнить операнд a с двумя другими. Нам поможет логический оператор &amp;&amp; (И).</p>
30 <p>Допустим, мы хотим проверить, что значение переменной a больше значений в переменных b и c. То есть сравнить операнд a с двумя другими. Нам поможет логический оператор &amp;&amp; (И).</p>
31 <p>Логический оператор &amp;&amp; (И) возвращает true, если слева и справа от него стоят значения true, а иначе - false.</p>
31 <p>Логический оператор &amp;&amp; (И) возвращает true, если слева и справа от него стоят значения true, а иначе - false.</p>
32 <p>Иными словами, если оба логических высказывания истинны, то и операция &amp;&amp; (И) возвращает истину.</p>
32 <p>Иными словами, если оба логических высказывания истинны, то и операция &amp;&amp; (И) возвращает истину.</p>
33 <p>Первый пример</p>
33 <p>Первый пример</p>
34 int a = 6; int b = 3; int c = 4; boolean d = (a &gt; b) &amp;&amp; (a &gt; c); System.out.println(d); --OUTPUT&gt; true<p>Как вычисляется значение выражения (a &gt; b) &amp;&amp; (a &gt; c):</p>
34 int a = 6; int b = 3; int c = 4; boolean d = (a &gt; b) &amp;&amp; (a &gt; c); System.out.println(d); --OUTPUT&gt; true<p>Как вычисляется значение выражения (a &gt; b) &amp;&amp; (a &gt; c):</p>
35 <p>Сначала проверяется условие (a &gt; b). Оно вернёт true, так как 6 больше 4. Далее проверяется условие (a &gt; c), которое также вернёт true, ведь 6 больше 3.</p>
35 <p>Сначала проверяется условие (a &gt; b). Оно вернёт true, так как 6 больше 4. Далее проверяется условие (a &gt; c), которое также вернёт true, ведь 6 больше 3.</p>
36 <p>Теперь у нас с двух сторон от логического оператора &amp;&amp; стоят значения true.</p>
36 <p>Теперь у нас с двух сторон от логического оператора &amp;&amp; стоят значения true.</p>
37 <p>По определению выше или по таблице ещё выше, результат вычисления логического выражения (true &amp;&amp; true) равен true.</p>
37 <p>По определению выше или по таблице ещё выше, результат вычисления логического выражения (true &amp;&amp; true) равен true.</p>
38 <p>Второй пример</p>
38 <p>Второй пример</p>
39 int a = 6; int b = 4; int c = 7; boolean d = (a &gt; b) &amp;&amp; (a &gt; c); System.out.println(d); --OUTPUT&gt; false<p>Результат операции (a &gt; b) вернёт true, так как 6 больше 4, а операция (a &gt; c) уже вернёт false, так как 6 не больше 7.</p>
39 int a = 6; int b = 4; int c = 7; boolean d = (a &gt; b) &amp;&amp; (a &gt; c); System.out.println(d); --OUTPUT&gt; false<p>Результат операции (a &gt; b) вернёт true, так как 6 больше 4, а операция (a &gt; c) уже вернёт false, так как 6 не больше 7.</p>
40 <p>Значит, слева от логического оператора &amp;&amp; стоит true, а справа - false. Следовательно, результат вычисления логического выражения (мы присвоили его булевой переменной d) будет false.</p>
40 <p>Значит, слева от логического оператора &amp;&amp; стоит true, а справа - false. Следовательно, результат вычисления логического выражения (мы присвоили его булевой переменной d) будет false.</p>
41 <p>Третий пример</p>
41 <p>Третий пример</p>
42 int a = 4; int b = 5; int c = 6; boolean d = (a &gt; b) &amp;&amp; (a &gt; c); System.out.println(d); --OUTPUT&gt; false<p>Результат операции сравнения (a &gt; b) равен false, а что вернёт операция (a &gt; c), уже значения не имеет (смотрите определение выше) - результат вычисления логического выражения (мы присвоили его булевой переменной d) будет равен false.</p>
42 int a = 4; int b = 5; int c = 6; boolean d = (a &gt; b) &amp;&amp; (a &gt; c); System.out.println(d); --OUTPUT&gt; false<p>Результат операции сравнения (a &gt; b) равен false, а что вернёт операция (a &gt; c), уже значения не имеет (смотрите определение выше) - результат вычисления логического выражения (мы присвоили его булевой переменной d) будет равен false.</p>
43 <p>Рассмотрим примеры с другими операторами.</p>
43 <p>Рассмотрим примеры с другими операторами.</p>
44 int a = 4; int b = 6; int c = 3; boolean d = (a &gt; b) || (a &gt; c); System.out.println(d); --OUTPUT&gt; true<p>Порядок вычисления:</p>
44 int a = 4; int b = 6; int c = 3; boolean d = (a &gt; b) || (a &gt; c); System.out.println(d); --OUTPUT&gt; true<p>Порядок вычисления:</p>
45 <ul><li>(a &gt; b) || (a &gt; c)</li>
45 <ul><li>(a &gt; b) || (a &gt; c)</li>
46 <li><strong>(4 &gt; 6)</strong>|| (4 &gt; 3)</li>
46 <li><strong>(4 &gt; 6)</strong>|| (4 &gt; 3)</li>
47 <li>false ||<strong>(4 &gt; 3)</strong></li>
47 <li>false ||<strong>(4 &gt; 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 &gt; b || a != b; System.out.println(c); --OUTPUT&gt; false<p>Теперь вычисляйте вы.</p>
51 int a = 9; int b = 9; boolean c = a &gt; b || a != b; System.out.println(c); --OUTPUT&gt; false<p>Теперь вычисляйте вы.</p>
52 int a = 5; int b = 6; int c = 7; boolean d = (b &gt; a) ^ (c &gt; a); System.out.println(d); --OUTPUT&gt; false<p>Порядок вычисления:</p>
52 int a = 5; int b = 6; int c = 7; boolean d = (b &gt; a) ^ (c &gt; a); System.out.println(d); --OUTPUT&gt; false<p>Порядок вычисления:</p>
53 <ul><li>(b &gt; a) ^ (c &gt; a)</li>
53 <ul><li>(b &gt; a) ^ (c &gt; a)</li>
54 <li><strong>(6 &gt; 5)</strong>^ (7 &gt; 5)</li>
54 <li><strong>(6 &gt; 5)</strong>^ (7 &gt; 5)</li>
55 <li>true ^<strong>(7 &gt; 5)</strong></li>
55 <li>true ^<strong>(7 &gt; 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 &gt; b); System.out.println(d); --OUTPUT&gt; true<p>Порядок вычисления:</p>
59 int a = 5; int b = 9; boolean d = !(a &gt; b); System.out.println(d); --OUTPUT&gt; true<p>Порядок вычисления:</p>
60 <ul><li>!(a &gt; b)</li>
60 <ul><li>!(a &gt; b)</li>
61 <li>!<strong>(5 &gt; 9)</strong></li>
61 <li>!<strong>(5 &gt; 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>&amp;&amp; и || называются сокращёнными логическими операторами AND и OR соответственно, или<strong>операторами короткой схемы вычислений</strong>. В спецификации Java их ещё зовут условными. Значения их операндов могут быть только булева типа.</p>
65 <p>&amp;&amp; и || называются сокращёнными логическими операторами AND и OR соответственно, или<strong>операторами короткой схемы вычислений</strong>. В спецификации Java их ещё зовут условными. Значения их операндов могут быть только булева типа.</p>
66 <p>В отличие от двойных, одиночные &amp; и | называются<strong>операторами полной схемы вычислений</strong>. Значения их операндов могут быть как только булевыми, так и только целочисленными (вместе с оператором ^ они используются в побитовых операциях).</p>
66 <p>В отличие от двойных, одиночные &amp; и | называются<strong>операторами полной схемы вычислений</strong>. Значения их операндов могут быть как только булевыми, так и только целочисленными (вместе с оператором ^ они используются в побитовых операциях).</p>
67 <p>В том, что для операторов &amp; и | всегда вычисляются значения обоих операндов, а при работе операторов &amp;&amp; и || второй операнд вычисляется только по необходимости.</p>
67 <p>В том, что для операторов &amp; и | всегда вычисляются значения обоих операндов, а при работе операторов &amp;&amp; и || второй операнд вычисляется только по необходимости.</p>
68 <p>То есть иногда результат выражения однозначно определён уже по первому операнду:</p>
68 <p>То есть иногда результат выражения однозначно определён уже по первому операнду:</p>
69 <ul><li>Если первый операнд &amp;&amp; равен false, то второй не вычисляется, так как уже понятно, что результат всего выражения будет false.</li>
69 <ul><li>Если первый операнд &amp;&amp; равен false, то второй не вычисляется, так как уже понятно, что результат всего выражения будет false.</li>
70 <li>Если первый операнд || равен true, то второй не вычисляется, так как уже понятно, что || вернёт true.</li>
70 <li>Если первый операнд || равен true, то второй не вычисляется, так как уже понятно, что || вернёт true.</li>
71 </ul><p>&amp;&amp; и || используют как операторы булевой логики. Они оперируют значениями только булева типа и применяются только в логических выражениях.</p>
71 </ul><p>&amp;&amp; и || используют как операторы булевой логики. Они оперируют значениями только булева типа и применяются только в логических выражениях.</p>
72 <p>&amp;&amp; и || позволяют экономить вычисления (применять короткую схему) и помогают избегать ошибок. Как это делается?</p>
72 <p>&amp;&amp; и || позволяют экономить вычисления (применять короткую схему) и помогают избегать ошибок. Как это делается?</p>
73 <p>Начнём с оператора &amp;&amp;. Приведём фрагмент из таблицы выше:</p>
73 <p>Начнём с оператора &amp;&amp;. Приведём фрагмент из таблицы выше:</p>
74 Логический операторОбозначение в JavaВыражениеРезультат"И" (AND): конъюнкция, логическое умножение&amp;&amp;true &amp;&amp; true<p>false &amp;&amp; false</p>
74 Логический операторОбозначение в JavaВыражениеРезультат"И" (AND): конъюнкция, логическое умножение&amp;&amp;true &amp;&amp; true<p>false &amp;&amp; false</p>
75 <p>true &amp;&amp; false</p>
75 <p>true &amp;&amp; false</p>
76 <p>false &amp;&amp; true</p>
76 <p>false &amp;&amp; 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 &gt; 4)</strong>AND (5 &gt; 4)</p>
80 <p>Рассмотрим выражение:<strong>(3 &gt; 4)</strong>AND (5 &gt; 4)</p>
81 <p>Мы видим, что операнд слева от оператора AND равен false. Смотрим на таблицу выше - и понимаем, что вычислять второй операнд бессмысленно, так как оператор AND уже точно вернёт false.</p>
81 <p>Мы видим, что операнд слева от оператора AND равен false. Смотрим на таблицу выше - и понимаем, что вычислять второй операнд бессмысленно, так как оператор AND уже точно вернёт false.</p>
82 <p>Именно по такой логике и работает оператор короткой схемы вычислений &amp;&amp;. Если выражение слева от него равно false, то выражение справа вычисляться не будет.</p>
82 <p>Именно по такой логике и работает оператор короткой схемы вычислений &amp;&amp;. Если выражение слева от него равно false, то выражение справа вычисляться не будет.</p>
83 <p>Так же и с оператором ||: если выражение слева от него равно true, то выражение справа не вычисляется, так как результат операции || всё равно будет true.</p>
83 <p>Так же и с оператором ||: если выражение слева от него равно true, то выражение справа не вычисляется, так как результат операции || всё равно будет true.</p>
84 <p>В большинстве случае применяют именно &amp;&amp; и ||. При верном использовании они избавляют Java от ненужных вычислений и страхуют от некоторых ошибок.</p>
84 <p>В большинстве случае применяют именно &amp;&amp; и ||. При верном использовании они избавляют Java от ненужных вычислений и страхуют от некоторых ошибок.</p>
85 <p>Первый пример</p>
85 <p>Первый пример</p>
86 int a = 3; int b = 0; boolean d = (b != 0) &amp;&amp; (a/b &gt; 0); System.out.println(d); --OUTPUT&gt; false<p>Если вместо оператора &amp;&amp; мы используем &amp;, то получим ошибку (исключение) java.lang.ArithmeticException: / by zero:</p>
86 int a = 3; int b = 0; boolean d = (b != 0) &amp;&amp; (a/b &gt; 0); System.out.println(d); --OUTPUT&gt; false<p>Если вместо оператора &amp;&amp; мы используем &amp;, то получим ошибку (исключение) java.lang.ArithmeticException: / by zero:</p>
87 int a = 3; int b = 0; boolean d = (b != 0) &amp; (a/b &gt; 0); System.out.println(d); --OUTPUT&gt; Exception in thread &lt;...&gt; java.lang.ArithmeticException: / by zero at &lt;...&gt;<p>Ошибка возникнет тогда, когда Java попытается вычислить второй аргумент логического выражения, если первый равнялся false.</p>
87 int a = 3; int b = 0; boolean d = (b != 0) &amp; (a/b &gt; 0); System.out.println(d); --OUTPUT&gt; Exception in thread &lt;...&gt; java.lang.ArithmeticException: / by zero at &lt;...&gt;<p>Ошибка возникнет тогда, когда Java попытается вычислить второй аргумент логического выражения, если первый равнялся false.</p>
88 <p>Иными словами, мы узнали, что b равно 0 (выражение b != 0 вернуло false) - и идём делить на b (делить на ноль), вычисляя значение второго операнда (a/b &gt; 0).</p>
88 <p>Иными словами, мы узнали, что b равно 0 (выражение b != 0 вернуло false) - и идём делить на b (делить на ноль), вычисляя значение второго операнда (a/b &gt; 0).</p>
89 <p>Второй пример</p>
89 <p>Второй пример</p>
90 public void printStringLengthMoreThenZero(String str) { if (str != null &amp;&amp; str.length() &gt; 0) { System.out.println(str.length()); } else { System.out.println("Тут нечего считать!"); } }<p>Код выше выводит в консоль длину строки str, в которой есть хотя бы один символ. А если строка пуста или её значение равно null (то есть строковая переменная ни на что не указывает), в консоль выводится сообщение: "Тут нечего считать!"</p>
90 public void printStringLengthMoreThenZero(String str) { if (str != null &amp;&amp; str.length() &gt; 0) { System.out.println(str.length()); } else { System.out.println("Тут нечего считать!"); } }<p>Код выше выводит в консоль длину строки str, в которой есть хотя бы один символ. А если строка пуста или её значение равно null (то есть строковая переменная ни на что не указывает), в консоль выводится сообщение: "Тут нечего считать!"</p>
91 <p>Мы выбрали оператор короткой схемы вычислений &amp;&amp; - и это правильно!</p>
91 <p>Мы выбрали оператор короткой схемы вычислений &amp;&amp; - и это правильно!</p>
92 <p>А вот если бы вместо этого использовали оператор полной схемы &amp;, то наш код работал бы не так, как надо.</p>
92 <p>А вот если бы вместо этого использовали оператор полной схемы &amp;, то наш код работал бы не так, как надо.</p>
93 <p>Мы получали бы ошибку NullPointerException каждый раз, когда вызываем метод для строковой переменной со значением null.</p>
93 <p>Мы получали бы ошибку NullPointerException каждый раз, когда вызываем метод для строковой переменной со значением null.</p>
94 <p>Посмотрим, что происходило бы при вычислении условия блока if:</p>
94 <p>Посмотрим, что происходило бы при вычислении условия блока if:</p>
95 <ul><li>str != null &amp; str.length() &gt; 0</li>
95 <ul><li>str != null &amp; str.length() &gt; 0</li>
96 <li><strong>null != null</strong>&amp; str.length() &gt; 0</li>
96 <li><strong>null != null</strong>&amp; str.length() &gt; 0</li>
97 <li>false &amp;<strong>str.length()</strong>&gt; 0<em>// тут возникает ошибка</em></li>
97 <li>false &amp;<strong>str.length()</strong>&gt; 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() &gt; 0 (иными словами - проверяется<em>"Число символов строки &gt; 0?"</em>).</p>
99 <p>Дальше Java должна вычислить второй аргумент логического выражения, а именно str.length() &gt; 0 (иными словами - проверяется<em>"Число символов строки &gt; 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>&amp; (AND)</li>
103 <li>&amp; (AND)</li>
104 <li>^ (XOR)</li>
104 <li>^ (XOR)</li>
105 <li>| (OR)</li>
105 <li>| (OR)</li>
106 <li>&amp;&amp; (условный AND)</li>
106 <li>&amp;&amp; (условный 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 &amp; false; System.out.println(a);<p>Вычислим true ^ true &amp; false:</p>
110 boolean a = true ^ true &amp; false; System.out.println(a);<p>Вычислим true ^ true &amp; false:</p>
111 <ul><li>Выбираем самый приоритетный оператор (если таких больше одного - тот, что левее). У нас самый приоритетный &amp; (он здесь такой один).</li>
111 <ul><li>Выбираем самый приоритетный оператор (если таких больше одного - тот, что левее). У нас самый приоритетный &amp; (он здесь такой один).</li>
112 <li>Смотрим, что слева и справа от него: это<strong>true</strong>и <strong>false</strong>соответственно.</li>
112 <li>Смотрим, что слева и справа от него: это<strong>true</strong>и <strong>false</strong>соответственно.</li>
113 <li>Вычисляем выражение true &amp; false - получаем false.</li>
113 <li>Вычисляем выражение true &amp; false - получаем false.</li>
114 <li>В исходном выражении заменяем true &amp; false результатом его вычисления (false) - и получаем: true ^ false.</li>
114 <li>В исходном выражении заменяем true &amp; 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 &amp; false</strong></li>
117 <ul><li>true ^<strong>true &amp; 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>Заменим &amp; на &amp;&amp;:</p>
121 <p>Заменим &amp; на &amp;&amp;:</p>
122 boolean a = true ^ true &amp;&amp; false; System.out.println(a);<p>Теперь самый приоритетный оператор в выражении это ^ - и порядок вычислений будет уже другой:</p>
122 boolean a = true ^ true &amp;&amp; false; System.out.println(a);<p>Теперь самый приоритетный оператор в выражении это ^ - и порядок вычислений будет уже другой:</p>
123 <ul><li><strong>true ^ true</strong>&amp;&amp; false</li>
123 <ul><li><strong>true ^ true</strong>&amp;&amp; false</li>
124 <li><strong>false &amp;&amp; false</strong></li>
124 <li><strong>false &amp;&amp; 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) &amp; false; System.out.println(a); --OUTPUT&gt; false<p>Добавив круглые скобки, мы поменяли приоритеты для вычисления. Теперь сперва будет определено выражение (true ^ true), которое вернёт false. А после - вычислится выражение false &amp; false, которое тоже вернёт false.</p>
128 boolean a = (true ^ true) &amp; false; System.out.println(a); --OUTPUT&gt; false<p>Добавив круглые скобки, мы поменяли приоритеты для вычисления. Теперь сперва будет определено выражение (true ^ true), которое вернёт false. А после - вычислится выражение false &amp; false, которое тоже вернёт false.</p>
129 <p>То есть скобки повышают приоритет стоящего внутри выражения, а внутри самих скобок действуют прежние приоритеты.</p>
129 <p>То есть скобки повышают приоритет стоящего внутри выражения, а внутри самих скобок действуют прежние приоритеты.</p>
130 <p>Пример посложнее - выражение !(true &amp;&amp; (false || true)) ^ !false.</p>
130 <p>Пример посложнее - выражение !(true &amp;&amp; (false || true)) ^ !false.</p>
131 <p>Порядок вычисления:</p>
131 <p>Порядок вычисления:</p>
132 <ul><li>!(true &amp;&amp;<strong>(false || true)</strong>) ^ !false</li>
132 <ul><li>!(true &amp;&amp;<strong>(false || true)</strong>) ^ !false</li>
133 <li>!<strong>(true &amp;&amp; true)</strong>^ !false</li>
133 <li>!<strong>(true &amp;&amp; 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>разной длины. И к ним уже применимы бинарные логические операторы ^, | и &amp;.</p>
141 <p><em><strong>Можно.</strong></em>Внутри Java все целочисленные типы представлены<a>двоичными числами</a>разной длины. И к ним уже применимы бинарные логические операторы ^, | и &amp;.</p>
142 <p>Только в этом случае они работают с двоичным представлением операндов - выполняют операции над их битами попарно (рассматривая их как логические единицы и нули). Поэтому и сами операторы ^, | и &amp; зовутся<em>побитовыми</em>.</p>
142 <p>Только в этом случае они работают с двоичным представлением операндов - выполняют операции над их битами попарно (рассматривая их как логические единицы и нули). Поэтому и сами операторы ^, | и &amp; зовутся<em>побитовыми</em>.</p>
143 <p>Рассмотрим пример:</p>
143 <p>Рассмотрим пример:</p>
144 int a = 3 &amp; 5; int b = 3 | 5; int c = 3 ^ 5; System.out.println(a); System.out.println(b); System.out.println(c); --OUTPUT&gt; 1 --OUTPUT&gt; 7 --OUTPUT&gt; 6<p>Чтобы повторить вычисления Java, нужно:</p>
144 int a = 3 &amp; 5; int b = 3 | 5; int c = 3 ^ 5; System.out.println(a); System.out.println(b); System.out.println(c); --OUTPUT&gt; 1 --OUTPUT&gt; 7 --OUTPUT&gt; 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>Применить к битам из каждого столбца оператор (&amp;, | или ^).</li>
148 <li>Применить к битам из каждого столбца оператор (&amp;, | или ^).</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>Берём цифры из обоих чисел и применяем к ним попарно оператор &amp; (AND):</p>
153 <p>Берём цифры из обоих чисел и применяем к ним попарно оператор &amp; (AND):</p>
154 3(10) = 011(2)011&amp;&amp;&amp;5(10) = 101(2)101===001(2) = 1(10)001<p>Получаем число 001. В десятичной записи ему соответствует число 1. Поэтому операция 3 &amp; 5 и возвращает в результате 1.</p>
154 3(10) = 011(2)011&amp;&amp;&amp;5(10) = 101(2)101===001(2) = 1(10)001<p>Получаем число 001. В десятичной записи ему соответствует число 1. Поэтому операция 3 &amp; 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>В одной из статей мы говорили про операторы сравнения &lt;, &gt;, &lt;=, &gt;=, ==, !=, а также instanceof, про условные конструкции if-else и switch. Учились работать с тернарным оператором.</p>
160 </ul><p>В одной из статей мы говорили про операторы сравнения &lt;, &gt;, &lt;=, &gt;=, ==, !=, а также 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>