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

Оператор XOR в Java

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

1. Обзор

В этом кратком руководстве мы узнаем об операторе Java XOR . Мы обсудим немного теории об операциях XOR , а затем посмотрим, как их реализовать в Java.

2. Оператор XOR

Начнем с напоминания о семантике операции XOR . Логическая операция XOR , исключающее или , принимает два логических операнда и возвращает значение true тогда и только тогда, когда операнды различны. И наоборот, он возвращает false, если два операнда имеют одинаковое значение.

Так, например, оператор XOR можно использовать, когда нам нужно проверить два условия, которые не могут быть истинными одновременно.

Рассмотрим два условия, A и B. В следующей таблице показаны возможные значения A XOR B :

./64f9b14176774169a27dcf41932efd6c.png

Операция XOR B эквивалентна (A AND !B) OR (!A AND B) . Скобки включены для ясности, но не являются обязательными, так как оператор И имеет приоритет над оператором ИЛИ .

3. Как это сделать на Java?

Теперь давайте посмотрим, как выразить операцию XOR в Java. Конечно, у нас есть возможность использовать операторы && и || операторы, но это может быть немного многословным, как мы увидим.

Представьте класс Car , имеющий два логических атрибута: Diesel и manual . Теперь предположим, что мы хотим сказать, является ли автомобиль дизельным или механическим, но не тем и другим одновременно.

Давайте проверим это с помощью && и || операторы:

Car car = Car.dieselAndManualCar();
boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual());

Это немного долго, особенно если учесть, что у нас есть альтернатива — оператор Java XOR , представленный символом ^ . Это побитовый оператор , означающий, что он сравнивает совпадающие биты двух значений, чтобы вернуть результат. В случае XOR , если два бита в одной и той же позиции имеют одинаковое значение, результирующий бит будет равен 0. В противном случае он будет равен 1.

Таким образом, вместо нашей громоздкой реализации XOR мы можем напрямую использовать оператор ^ :

Car car = Car.dieselAndManualCar();
boolean dieselXorManual = car.isDiesel() ^ car.isManual();

Как мы видим, оператор ^ позволяет нам быть более лаконичным в выражении операций XOR .

Наконец, стоит упомянуть, что оператор XOR , как и другие побитовые операторы, работает со всеми типами примитивов. Например, рассмотрим два целых числа, 1 и 3, двоичные представления которых равны 00000001 и 000000011 соответственно. Использование оператора XOR между ними приведет к целому числу 2:

assertThat(1 ^ 3).isEqualTo(2);

В этих двух числах отличается только второй бит; поэтому результатом операции XOR для этого бита будет 1. Все остальные биты идентичны, поэтому их результат побитового XOR равен 0, что дает нам окончательное значение 00000010, двоичное представление целого числа 2.

4. Вывод

В этой статье мы узнали об операторе Java XOR . Мы продемонстрировали, как он предлагает краткий способ выражения операций XOR .

Как обычно, полный код статьи можно найти на GitHub .