Перейти к основному содержимому

Логический и побитовый оператор ИЛИ

· 6 мин. чтения

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 .