Оператор XOR в Java

1. Обзор

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

2. Оператор XOR

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

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

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

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

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

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

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

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

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

Это немного долго, особенно если учесть, что у нас есть альтернатива - оператор XOR Java , представленный символом ^ . Это побитовый оператор, то есть оператор, сравнивающий совпадающие биты двух значений, чтобы вернуть результат. В случае 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.