1. Введение
В компьютерном программировании случай использования ИЛИ заключается в том, что это либо логическая конструкция для булевой логики, либо побитовая математическая операция для манипулирования данными на битовом уровне .
Логический оператор используется для принятия решений на основе определенных условий, а побитовый оператор используется для быстрых двоичных вычислений, включая маскировку IP-адреса.
В этом уроке мы узнаем о логических и побитовых операторах ИЛИ, представленных || и | соответственно .
2. Использование логического ИЛИ
2.1. Как это работает
Логический оператор ИЛИ работает с булевыми операндами. Он возвращает true
, если хотя бы один из операндов имеет значение true , в
противном случае возвращает false
:
- правда || правда = правда
- правда || ложь = правда
- ложно || правда = правда
- ложно || ложь = ложь
2.2. Пример
Давайте разберемся с помощью некоторых булевых
переменных:
boolean condition1 = true;
boolean condition2 = true;
boolean condition3 = false;
boolean condition4 = false;
Когда мы применяем логическое ИЛИ к двум истинным
операндам, результат будет истинным
:
boolean result = condition1 || condition2;
assertTrue(result);
Когда мы применяем логическое ИЛИ к одному истинному
и одному ложному
операнду, результат будет истинным
:
boolean result = condition1 || condition3;
assertTrue(result);
И когда мы применяем логическое ИЛИ к двум ложным
операндам, результат будет ложным
:
boolean result = condition3 || condition4;
assertFalse(result);
Когда есть несколько операндов, оценка эффективно выполняется слева направо . Итак, выражение условие1 || условие2 || условие3 || условие4
приведет к той же логике, что и:
boolean result1 = condition1 || condition2;
boolean result2 = result1 || condition3;
boolean finalResult = result2 || condition4;
assertTrue(finalResult);
На практике, однако, Java может сократить приведенное выше выражение.
3. Короткое замыкание
Логический оператор ИЛИ имеет поведение короткого замыкания. Это означает, что он возвращает true
, как только один из операндов оценивается как true
, без оценки остальных операндов.
Рассмотрим следующий пример:
boolean returnAndLog(boolean value) {
System.out.println("Returning " + value);
return value;
}
if (returnAndLog(true) || returnAndLog(false)) {
}
Output:
Returning true
if (returnAndLog(false) || returnAndLog(true)) {
}
Output:
Returning false
Returning true
Здесь мы видим, что второе логическое условие не оценивается, если предыдущее условие истинно
.
Следует отметить, что это может привести к неожиданным результатам, если какой-либо из вызываемых методов имеет побочный эффект. Мы получим другой результат, если перепишем первый пример так, чтобы он захватывал логические
значения перед оператором if
:
boolean result1 = returnAndLog(true);
boolean result2 = returnAndLog(false);
if (result1 || result2) {
}
Output:
Returning true
Returning false
4. Использование побитового ИЛИ
4.1. Как это работает
Побитовое ИЛИ является бинарным оператором и оценивает ИЛИ каждого соответствующего бита двух целочисленных операндов . Он возвращает 1, если хотя бы один из битов равен 1, в противном случае он возвращает 0. Кроме того, этот оператор всегда оценивает оба операнда:
- 1 | 1 = 1
- 1 | 0 = 1
- 0 | 1 = 1
- 0 | 0 = 0
Таким образом, когда мы применяем побитовое ИЛИ к двум целым числам, результатом будет новое целое число.
4.2. Пример
Рассмотрим пример:
int four = 4; //0100 = 4
int three = 3; //0011 = 3
int fourORthree = four | three;
assertEquals(7, fourORthree); // 0111 = 7
Теперь посмотрим, как работает описанная выше операция.
Сначала каждое целое число преобразуется в его двоичное представление:
- Двоичное представление числа
4
равно0100 .
- Двоичное представление числа
3
равно0011 .
Затем выполняется побитовое ИЛИ соответствующих битов, чтобы получить двоичное представление, представляющее окончательный результат:
0100
0011
----
0111
Теперь 0111
при обратном преобразовании в десятичное представление даст нам окончательный результат: целое число 7
.
При наличии нескольких операндов оценка выполняется слева направо . Итак, выражение 1 | 2 | 3 | 4
будет оцениваться как:
int result1 = 1 | 2;
int result2 = result1 | 3;
int finalResult = result2 | 4;
assertEquals(finalResult,7);
5. Совместимые типы
В этом разделе мы рассмотрим типы данных, с которыми совместимы эти операторы.
5.1. Логическое ИЛИ
Логический оператор ИЛИ может использоваться только с булевыми операндами. И использование его с целочисленными операндами приводит к ошибке компиляции:
boolean result = 1 || 2;
Compilation error: Operator '||' cannot be applied to 'int', 'int
5.2. Побитовое ИЛИ
Наряду с целочисленными операндами побитовое ИЛИ также может использоваться с логическими операндами. Он возвращает true
, если хотя бы один из операндов имеет значение true
, в противном случае возвращает false
.
Давайте разберемся с помощью некоторых булевых
переменных на примере:
boolean condition1 = true;
boolean condition2 = true;
boolean condition3 = false;
boolean condition4 = false;
boolean condition1_OR_condition2 = condition1 | condition2;
assertTrue(condition1_OR_condition2);
boolean condition1_OR_condition3 = condition1 | condition3;
assertTrue(condition1_OR_condition3);
boolean condition3_OR_condition4 = condition3 | condition4;
assertFalse(condition3_OR_condition4);
6. Приоритет
Давайте рассмотрим приоритет логического и побитового оператора ИЛИ среди других операторов:
- Операторы с более высоким приоритетом: ++ –– * + – / >> << > < == !=
- Побитовое И: &
- Побитовое ИЛИ: |
- Логическое И: &&
- Логическое ИЛИ: ||
- Операторы с более низким приоритетом: ? : = += -= *= /= >>= <<=
Быстрый пример поможет нам лучше понять это:
boolean result = 2 + 4 == 5 || 3 < 5;
assertTrue(result);
Учитывая низкий приоритет логического оператора ИЛИ, приведенное выше выражение будет оцениваться как:
((2+4) == 5) || (3 < 5)
И тогда (6 == 5) || (3 < 5)
А потом ложно || истинный
Это делает результат верным.
Теперь рассмотрим другой пример с побитовым оператором ИЛИ:
int result = 1 + 2 | 5 - 1;
assertEquals(7, result);
Вышеприведенное выражение будет оцениваться как:
(1+2) | (5-1)
И затем, 3 | 4
Следовательно, результат будет 7
.
7. Заключение
В этой статье мы узнали об использовании логических и побитовых операторов ИЛИ для логических и целочисленных операндов.
Мы также рассмотрели основную разницу между двумя операторами и их приоритет среди других операторов.
Как всегда, код примера доступен на GitHub .