O operador XOR em Java
1. Visão geral
Neste breve tutorial, aprenderemos sobre o operador JavaXOR. Faremos um pouco de teoria sobre as operaçõesXOR e, em seguida, veremos como implementá-las em Java.
2. O operadorXOR
Vamos começar com um pequeno lembrete da semântica da operaçãoXOR. The XOR logical operation, or exclusive or, takes two boolean operands and returns true if and only if the operands are different. Assim, retorna falso se os dois operandos tiverem o mesmo valor.
Portanto, o operadorXOR pode ser usado, por exemplo, quando temos que verificar duas condições que não podem ser verdadeiras ao mesmo tempo.
Vamos considerar duas condições,AeB. Então a seguinte tabela mostra os valores possíveis deA XOR B:
The A XOR B operation is equivalent to (A AND !B) OR (!A AND B). Parênteses foram incluídos para maior clareza, mas são opcionais, pois o operadorAND tem precedência sobre o operadorOR.
3. Como fazê-lo em Java?
Agora, vamos ver como expressar a operaçãoXOR em Java. Of course, we have the possibility to use the && and || operators, but this can be a bit wordy, como veremos.
Imagine uma classeCar com dois atributosboolean:dieselemanual. E agora, digamos que queremos saber se o carro é a diesel ou manual, mas não os dois.
Vamos verificar isso usando os operadores&&e||:
Car car = Car.dieselAndManualCar();
boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual());
That’s a bit long, especially considering that we have an alternative — the Java XOR operator, represented by the ^ symbol. É umbitwise operator - isto é, um operador que compara os bits correspondentes de dois valores para retornar um resultado. No caso deXOR, se dois bits da mesma posição tiverem o mesmo valor, o bit resultante será 0. Caso contrário, será 1.
Portanto, em vez de nossa implementação complicada deXOR, podemos usar diretamente o operador^:
Car car = Car.dieselAndManualCar();
boolean dieselXorManual = car.isDiesel() ^ car.isManual();
Como podemos ver, o operador^ nos permite ser mais concisos ao expressar as operaçõesXOR.
Finally, it’s worth mentioning that the XOR operator, like the other bitwise operators, works with every primitive type. Por exemplo, vamos considerar dois inteiros 1 e 3, cujas representações binárias são 00000001 e 000000011, respectivamente. Então, usar o operadorXOR entre eles resultará no inteiro 2:
assertThat(1 ^ 3).isEqualTo(2);
Apenas o segundo bit é diferente nesses dois números, portanto, o resultado do operadorXOR neste bit será 1. Todos os outros bits são idênticos, portanto, seu resultado bit a bitXOR é 0, dando-nos um valor final de 00000010 - a representação binária do inteiro 2.
4. Conclusão
Neste artigo, aprendemos sobre o operador JavaXOR. Vimos que ele oferece uma forma concisa de expressarXOR operações.
Como de costume, o código completo do artigo pode ser encontradoover on GitHub.