Operator XOR w Javie

1. Przegląd

Z tego krótkiego samouczka dowiemy się o operatorze Java XOR . Omówimy trochę teorii na temat operacji XOR , a następnie zobaczymy, jak zaimplementować je w Javie.

2. Operator XOR

Zacznijmy od małego przypomnienia semantyki operacji XOR . Operacja logiczna XOR , lub wyłączne lub , przyjmuje dwa operandy boolowskie i zwraca prawdę wtedy i tylko wtedy, gdy argumenty są różne. W związku z tym zwraca wartość false, jeśli dwa operandy mają tę samą wartość.

Tak więc operator XOR może być używany na przykład, gdy musimy sprawdzić dwa warunki, które nie mogą być spełnione w tym samym czasie.

Rozważmy dwa warunki, A i B. Następnie poniższa tabela pokazuje możliwe wartości A XOR B :

Operacja A XOR B jest równoważna (A AND! B) OR (! A AND B) . Dla przejrzystości dodano nawiasy, ale są one opcjonalne, ponieważ operator AND ma pierwszeństwo przed operatorem OR .

3. Jak to zrobić w Javie?

Teraz zobaczmy, jak wyrazić operację XOR w Javie. Oczywiście mamy możliwość korzystania z && i || operatorów, ale jak zobaczymy, może to być trochę rozwlekłe .

Wyobraź sobie klasę samochodów, która ma dwa logiczne atrybuty: olej napędowy i instrukcję obsługi . A teraz powiedzmy, że chcemy powiedzieć, czy samochód jest albo z silnikiem wysokoprężnym, czy z ręcznym napędem, ale nie oba.

Sprawdźmy to za pomocą && i || operatorzy:

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

To trochę za dużo, zwłaszcza biorąc pod uwagę, że mamy alternatywę - operator Java XOR , reprezentowany przez symbol ^ . Jest to operator bitowy - czyli operator porównujący pasujące bity dwóch wartości w celu zwrócenia wyniku. W przypadku XOR , jeśli dwa bity tej samej pozycji mają tę samą wartość, wynikowy bit będzie wynosił 0. W przeciwnym razie będzie 1.

Więc zamiast naszej kłopotliwej implementacji XOR , możemy bezpośrednio użyć operatora ^ :

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

Jak możemy, operator ^ pozwala nam być bardziej zwięzłym w wyrażaniu operacji XOR .

Na koniec warto wspomnieć, że operator XOR , podobnie jak inne operatory bitowe, działa z każdym typem pierwotnym. Na przykład, rozważmy dwie liczby całkowite 1 i 3, których binarne reprezentacje to odpowiednio 00000001 i 000000011. Następnie użycie operatora XOR między nimi da w wyniku liczbę całkowitą 2:

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

Tylko drugi bit różni się w tych dwóch liczbach, dlatego wynikiem działania operatora XOR na tym bicie będzie 1. Wszystkie pozostałe bity są identyczne, więc ich bitowy wynik XOR wynosi 0, co daje nam końcową wartość 00000010 - reprezentacja binarna liczby całkowitej 2.

4. Wniosek

W tym artykule dowiedzieliśmy się o operatorze Java XOR . Widzieliśmy, że oferuje zwięzły sposób wyrażenia operacji XOR .

Jak zwykle pełny kod artykułu można znaleźć na GitHub.