HOWTO · Java
El operador XOR en Java
Use el operador ^ de Java para XOR booleano y entero, con ejemplos probados y errores comunes.
En esta página
En Java, ^ es el operador XOR (OR exclusivo). Úselo con valores boolean cuando exactamente una condición deba ser verdadera, o con valores enteros cuando necesite un XOR a nivel de bits. No es un operador de potenciación: Java no tiene el operador **. La especificación del lenguaje Java define ambas formas de ^.
Elija la forma booleana para condiciones y la entera para bits o máscaras. El operador está disponible en las versiones actuales de Java; los ejemplos se ejecutaron con OpenJDK 17.0.20.1, mientras que la preparación consultó la información de la versión actual JDK 26.
Usar XOR con valores booleanos
Para dos operandos booleanos, XOR es true solo si los operandos son distintos. Su tabla de verdad es sencilla:
| Izquierda | Derecha | left ^ right |
|---|---|---|
false |
false |
false |
false |
true |
true |
true |
false |
true |
true |
true |
false |
A diferencia de && y ||, ^ evalúa ambos operandos. No lo use como reemplazo de una protección de cortocircuito como value != null && value.isReady(): la llamada al método se sigue evaluando. Úselo cuando sea seguro evaluar ambas expresiones booleanas y la regla sea «exactamente una».
Este ejemplo probado muestra juntos XOR booleano y XOR entero:
public class BooleanAndIntegerXor {
public static void main(String[] args) {
System.out.println(true ^ false);
System.out.println(true ^ true);
System.out.println(0b1100 ^ 0b1010);
}
}
Salida:
true
false
6
Las dos primeras líneas muestran la regla booleana. Para enteros, 0b1100 ^ 0b1010 produce 0b0110, que es 6 decimal: cada bit de resultado es 1 solo donde los bits de entrada difieren.
Usar XOR con valores enteros y máscaras
La forma bit a bit acepta tipos primitivos enteros como byte, short, char, int y long. Java aplica promoción numérica binaria antes de la operación, por lo que las expresiones con tipos enteros menores suelen dar un resultado int. float y double no pueden ser operandos XOR. Convierta solo cuando el tipo de destino realmente lo requiera; una conversión puede descartar bits.
XOR sirve para alternar bits seleccionados. Si flags es un entero y mask identifica los bits que se cambian, flags ^ mask invierte exactamente esos bits. Aplicar la misma máscara de nuevo restaura los bits originales porque x ^ y ^ y es igual a x. Esta propiedad reversible sirve para una manipulación controlada de bits, pero no sustituye una lógica de aplicación más clara.
Encontrar un valor sin pareja
Un uso compacto de XOR entero encuentra un valor cuando todos los demás aparecen exactamente dos veces. Los valores iguales se cancelan porque x ^ x es 0 y 0 ^ x es x.
public class UniqueNumberXor {
public static void main(String[] args) {
int unique = 0;
for (int value : new int[] {4, 9, 4}) {
unique ^= value;
}
System.out.println(unique);
}
}
Salida:
9
Esta técnica depende de condiciones límite, no es un algoritmo general para encontrar un número único. Funciona solo cuando un valor no tiene pareja y todos los demás aparecen exactamente dos veces. Por ejemplo, no identifica un único valor si otro aparece tres veces. Elija un enfoque de conteo cuando la regla de ocurrencias sea distinta o también necesite frecuencias.
Preferir alternativas claras cuando correspondan
Use != para comparar la desigualdad de dos valores booleanos; puede comunicar la intención con más claridad que ^. Use & 1 para comprobar si un entero es par o impar: la operación de paridad es AND, no XOR. Aunque intercambiar dos variables con XOR es un truco conocido, una variable temporal o una asignación normal es más clara en Java y evita errores de alias.
La distinción clave es sencilla: ^ significa OR exclusivo para valores boolean y XOR bit a bit para valores enteros. Compruebe los tipos de los operandos, recuerde que ambos lados booleanos se evalúan y declare las suposiciones sobre los datos antes de depender de la cancelación de duplicados.