La disyunción exclusiva es verdadera cuando exactamente una proposición es verdadera. Se usa para expresar alternativas excluyentes: una opción u otra, pero no ambas.
En el tema anterior vimos la disyunción inclusiva, que es verdadera cuando al menos una proposición es verdadera. La disyunción exclusiva, conocida como XOR, es diferente.
XOR exige que se cumpla exactamente una de las proposiciones. Si no se cumple ninguna, el resultado es falso. Si se cumplen ambas, también es falso.
La disyunción exclusiva representa una elección entre alternativas que no deben ocurrir simultáneamente.
Ejemplo en lenguaje natural:
La disyunción exclusiva puede representarse de distintas maneras según el libro o el contexto.
| Notación | Lectura |
|---|---|
| p ⊕ q | p XOR q |
| p ⊻ q | p o exclusivo q |
| p ≠ q | p y q tienen valores distintos |
La tabla de verdad de XOR muestra que el resultado es verdadero solo cuando los valores de p y q son diferentes.
| p | q | p ⊕ q |
|---|---|---|
| V | V | F |
| V | F | V |
| F | V | V |
| F | F | F |
La diferencia clave aparece cuando ambas proposiciones son verdaderas.
| p | q | p ∨ q | p ⊕ q |
|---|---|---|---|
| V | V | V | F |
| V | F | V | V |
| F | V | V | V |
| F | F | F | F |
OR inclusivo acepta que ambas proposiciones sean verdaderas. XOR no lo acepta.
JavaScript no tiene un operador lógico XOR directo para booleanos. Una forma clara de expresarlo es comparar si dos booleanos son distintos.
const pagoConTarjeta = true;
const pagoConTransferencia = false;
const eligioUnSoloMedio = pagoConTarjeta !== pagoConTransferencia;
console.log(eligioUnSoloMedio);
El resultado es true porque una proposición es verdadera y la otra falsa.
XOR también puede construirse usando operadores ya conocidos.
Esto significa: se cumple p o q, pero no se cumplen ambas al mismo tiempo.
const p = true;
const q = false;
const xor = (p || q) && !(p && q);
console.log(xor);
También puede expresarse como dos casos posibles: p verdadera y q falsa, o p falsa y q verdadera.
const p = true;
const q = false;
const xor = (p && !q) || (!p && q);
console.log(xor);
Supongamos que un formulario exige ingresar email o teléfono, pero no ambos.
const ingresoEmail = true;
const ingresoTelefono = false;
const contactoValido = ingresoEmail !== ingresoTelefono;
if (contactoValido) {
console.log("Contacto válido");
} else {
console.log("Debe ingresar exactamente un medio de contacto");
}
La condición es verdadera solo cuando se ingresó exactamente uno de los dos medios.
XOR es útil cuando dos opciones no pueden seleccionarse al mismo tiempo.
const envioADomicilio = true;
const retiroEnSucursal = true;
const opcionEnvioValida = envioADomicilio !== retiroEnSucursal;
console.log(opcionEnvioValida);
El resultado es false porque se seleccionaron ambas opciones, y la regla exige exactamente una.
Cuando hay más de dos opciones, la idea "exactamente una" requiere contar cuántas condiciones son verdaderas.
const tarjeta = false;
const transferencia = true;
const efectivo = false;
const cantidadSeleccionada = [tarjeta, transferencia, efectivo]
.filter(Boolean)
.length;
const eligioExactamenteUna = cantidadSeleccionada === 1;
console.log(eligioExactamenteUna);
Este enfoque es más claro cuando se trabaja con tres o más alternativas excluyentes.
Para dos valores booleanos, XOR coincide con la idea de que los valores son distintos.
| p | q | p !== q |
|---|---|---|
| true | true | false |
| true | false | true |
| false | true | true |
| false | false | false |
No toda frase con "o" necesita XOR. Muchas reglas permiten que ambas condiciones se cumplan y, en ese caso, corresponde usar OR inclusivo.
| Regla | Operador adecuado | Motivo |
|---|---|---|
| Puede acceder si es admin o editor | OR | Un usuario podría tener ambos roles |
| Debe elegir entrega a domicilio o retiro en sucursal, pero no ambos | XOR | Las opciones son excluyentes |
| Puede recuperar la cuenta con email o teléfono | Depende de la regla | Hay que definir si se permite tener ambos |
La disyunción exclusiva permite representar reglas donde debe cumplirse una opción u otra, pero no ambas. Es especialmente útil en formularios, configuraciones y decisiones con alternativas excluyentes.
En el próximo tema estudiaremos la implicación lógica.