10. Disyunción exclusiva (XOR)

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.

10.1 Introducción

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.

10.2 Idea principal

La disyunción exclusiva representa una elección entre alternativas que no deben ocurrir simultáneamente.

p XOR q es verdadera cuando p es verdadera y q es falsa, o cuando p es falsa y q es verdadera.

Ejemplo en lenguaje natural:

  • El usuario paga con tarjeta.
  • El usuario paga con transferencia.
  • La compra acepta exactamente un medio de pago.

10.3 Símbolos de XOR

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

10.4 Tabla de verdad

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

10.5 Diferencia entre OR y XOR

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.

10.6 XOR en JavaScript

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.

10.7 Expresar XOR con AND, OR y NOT

XOR también puede construirse usando operadores ya conocidos.

p ⊕ q equivale a (p ∨ q) ∧ ¬(p ∧ q)

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);

10.8 Otro modo de expresar XOR

También puede expresarse como dos casos posibles: p verdadera y q falsa, o p falsa y q verdadera.

p ⊕ q equivale a (p ∧ ¬q) ∨ (¬p ∧ q)
const p = true;
const q = false;

const xor = (p && !q) || (!p && q);

console.log(xor);

10.9 Caso práctico: método de contacto

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.

10.10 Caso práctico: opciones excluyentes

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.

10.11 XOR con más de dos condiciones

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.

10.12 XOR y desigualdad booleana

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

10.13 Cuándo no usar XOR

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

10.14 Errores comunes

  • Usar XOR cuando la regla permite que ambas condiciones sean verdaderas.
  • Usar OR inclusivo cuando se necesita exactamente una opción.
  • Aplicar !== a valores que no son booleanos sin normalizarlos antes.
  • No aclarar si la palabra "o" del lenguaje natural es inclusiva o exclusiva.
  • Intentar extender XOR a muchas opciones sin contar cuántas son verdaderas.

10.15 Qué debes recordar de este tema

  • XOR es verdadera cuando exactamente una proposición es verdadera.
  • Si ambas proposiciones son verdaderas, XOR es falsa.
  • Para dos booleanos en JavaScript, puede expresarse como p !== q.
  • XOR puede construirse con AND, OR y NOT.
  • Antes de usar XOR, hay que confirmar que las opciones realmente sean excluyentes.

10.16 Conclusión

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.