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

Побитовые и против логических операторов &&

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

1. Введение

В Java у нас есть два способа сказать «И». Но что использовать?

В этом уроке мы рассмотрим различия между & и &&. Попутно мы узнаем о побитовых операциях и коротких замыканиях.

2. Использование побитового И

Побитовый оператор AND (&) сравнивает каждую двоичную цифру двух целых чисел и возвращает 1, если оба числа равны 1, иначе возвращает 0.

Давайте посмотрим на два целых числа:

int six = 6;
int five = 5;

Далее применим к этим числам побитовый оператор И:

int resultShouldBeFour = six & five;
assertEquals(4, resultShouldBeFour);

Чтобы понять эту операцию, давайте посмотрим на двоичное представление каждого числа:

Binary of decimal 4: 0100
Binary of decimal 5: 0101
Binary of decimal 6: 0110

Оператор & выполняет логическое И для каждого бита и возвращает новое двоичное число:

0110
0101
-----
0100

Наконец, наш результат — 0100 — можно преобразовать обратно в десятичное число — 4 .

Давайте посмотрим тестовый Java-код:

int six = 6;
int five = 5;
int resultShouldBeFour = six & five;
assertEquals(4, resultShouldBeFour);

2.1. Использование & с логическими значениями

Кроме того, мы можем использовать побитовый оператор AND ( & ) с логическими операндами. Он возвращает true только в том случае, если оба операнда имеют значение true , в противном случае он возвращает false.

Возьмем три логические переменные:

boolean trueBool = true;
boolean anotherTrueBool = true;
boolean falseBool = false;

Далее применим побитовый оператор AND к переменным trueBool и AnotherTrueBool :

boolean trueANDtrue = trueBool & anotherTrueBool;

Тогда результат будет верным .

Далее применим побитовый оператор И к trueBool и falseBool :

boolean trueANDFalse = trueBool & falseBool;

В этом случае результат будет ложным .

Давайте посмотрим тестовый Java-код:

boolean trueBool = true;
boolean anotherTrueBool = true;
boolean falseBool = false;

boolean trueANDtrue= trueBool & anotherTrueBool;
boolean trueANDFalse = trueBool & falseBool;

assertTrue(trueANDtrue);
assertFalse(trueANDFalse);

3. Использование логического И

Как и оператор логического И ( && ), он сравнивает значения двух логических переменных или выражений. И он также возвращает true , только если оба операнда истинны , в противном случае он возвращает false .

Возьмем три логические переменные:

boolean trueBool = true;
boolean anotherTrueBool = true;
boolean falseBool = false;

Далее применим логический оператор И к переменным trueBool и AnotherTrueBool :

boolean trueANDtrue = trueBool && anotherTrueBool;

Тогда результат будет верным .

Далее применим логический оператор И к trueBool и falseBool :

boolean trueANDFalse = trueBool && falseBool;

В этом случае результат будет ложным .

Давайте посмотрим тестовый Java-код:

boolean trueBool = true;
boolean anotherTrueBool = true;
boolean falseBool = false;
boolean anotherFalseBool = false;

boolean trueANDtrue = trueBool && anotherTrueBool;
boolean trueANDFalse = trueBool && falseBool;
boolean falseANDFalse = falseBool && anotherFalseBool;

assertTrue(trueANDtrue);
assertFalse(trueANDFalse);
assertFalse(falseANDFalse);

3.1. Короткое замыкание

Итак, какая разница? Ну, оператор && закорачивает. Это означает, что он не оценивает правый операнд или выражение, когда левый операнд или выражение имеет значение false .

Возьмем два выражения, которые оцениваются как ложные:

First Expression: 2<1
Second Expression: 4<5

Когда мы применяем логический оператор И к выражениям 2<1 и 4<5, он оценивает только первое выражение 2<1 и возвращает false.

boolean shortCircuitResult = (2<1) && (4<5);
assertFalse(shortCircuitResult);

3.2. Использование && с целыми числами

Мы можем использовать оператор & с логическими или числовыми типами, но && можно использовать только с логическими операндами. Использование его с целочисленными операндами приводит к ошибке компиляции:

int five = 2;
int six = 4;
int result = five && six;

4. Сравнение

  1. Оператор & всегда оценивает оба выражения, тогда как оператор && оценивает второе выражение, только если первое истинно .
  2. & сравнивает каждый операнд побитово, тогда как && работает только с логическими значениями

5. Вывод

В этой статье мы использовали побитовый оператор & для сравнения битов двух цифр, в результате чего получается новая цифра. Кроме того, мы использовали логический оператор && для сравнения двух логических значений, в результате чего было получено логическое значение.

Мы также увидели некоторые ключевые различия между двумя операторами.

Как всегда, вы можете найти код для этого руководства на GitHub .