«1. Обзор

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

2. Оператор XOR

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4. Заключение

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

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

«