Автор оригинала: François Dupire.
1. Обзор
В этом коротком уроке мы узнаем об операторе Java XOR . Мы рассмотрим немного теории об операциях XOR , а затем посмотрим, как их реализовать в Java.
2. Оператор XOR
Давайте начнем с небольшого напоминания о семантике операции XOR . Логическая операция XOR , или exclusive или , принимает два логических операнда и возвращает true тогда и только тогда, когда операнды различны. Таким образом, он возвращает false, если два операнда имеют одинаковое значение.
Таким образом, оператор XOR можно использовать, например, когда нам нужно проверить наличие двух условий, которые не могут быть истинными одновременно.
Рассмотрим два условия, A и B. Тогда в следующей таблице показаны возможные значения A XOR B :
Операция A XOR B эквивалентна (A И !B) ИЛИ (!A И 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 .