Electrónica Digital · Tema 10

XOR y XNOR

AND y OR deciden «todos» o «alguno». XOR y XNOR hacen otra pregunta: ¿son iguales? Una responde «difieren» y la otra «coinciden». De estas dos puertas salen el sumador, el detector de errores, el comparador y hasta el cifrado más simple que existe. Pocas piezas rinden tanto.

≈ 45 minutos Sin materiales: solo el navegador Incluye simulador y Python

01 · Punto de partida

¿Son iguales o no?

Hay dos preguntas que se repiten en todo sistema: «¿lo que leí es igual a lo que esperaba?» y «¿cambió algo desde la última vez?». Las dos son la misma pregunta: comparar dos bits. La puerta que responde «difieren» es la XOR (OR exclusivo); la que responde «coinciden» es la XNOR.

Una escena típica. Un módulo GPS te manda una sentencia de texto terminada en un par de dígitos hexadecimales. Si calculás el XOR de todos los caracteres y no coincide con ese par, la línea llegó corrompida. Un disco de un arreglo RAID falla, y el sistema reconstruye su contenido haciendo XOR con los demás. Dos sensores redundantes de seguridad discrepan y salta una alarma.

Detrás de los tres hay la misma puerta. En software ya la usás: es a != b con booleanos y a ^ b con enteros. Acá la ves como una pieza de silicio de cuatro por chip.

  • ¿Qué filas dan 1 en cada una, y qué reglas cumple el XOR?
  • ¿Cómo se usa un XOR como inversor que se puede encender y apagar?
  • ¿Cómo se comparan dos números de N bits y cuántos bits difieren?
  • ¿Qué relación hay entre XOR, la suma binaria y la paridad?
  • ¿Qué trampa trae el chip de XNOR?

02 · XOR

Detector de diferencias

La salida del XOR vale 1 cuando las entradas son distintas. Se escribe Y = A⊕B. El símbolo es una OR con una curva extra en la entrada, y el chip estándar es el 74HC86, con cuatro puertas.

Tabla del XOR de dos entradas. Firma 0110, Σm(1, 2). Difiere del OR solo en la fila 11.
ABORXORLectura
0000Iguales: no hay diferencia
0111Difieren
1011Difieren
1110Iguales: «el exclusivo» los descarta

El XOR tiene cuatro lecturas equivalentes, y conviene saltar de una a otra según el problema:

«Difieren»
Es el a != b del software. Compara dos bits y marca la discrepancia.
«Uno solo está en 1» (OR exclusivo)
«Uno u otro, pero no los dos». Distinto del OR común, que incluye el caso 11.
«Cantidad impar de unos»
Con dos entradas, la salida es 1 cuando hay exactamente un uno. Con N entradas encadenadas, es 1 cuando hay una cantidad impar: la paridad (Tema 26).
«Suma sin acarreo»
0+0 = 0, 0+1 = 1, 1+0 = 1 y 1+1 = 0 (el 1 que se pierde es el acarreo, que calcula un AND aparte). Es el bit de suma del sumador (Tema 23).

Reglas del XOR

Reglas básicas del XOR. Cada una se demuestra con su tabla.
ReglaExpresiónQué significa en la práctica
Elemento neutroA⊕0 = AXOR con 0 deja pasar el bit sin tocarlo
InversiónA⊕1 = ~AXOR con 1 invierte el bit
AnulaciónA⊕A = 0Dos bits iguales se cancelan
ComplementoA⊕~A = 1Un bit y su opuesto siempre difieren
Conmutativa y asociativaA⊕B = B⊕A; (A⊕B)⊕C = A⊕(B⊕C)El orden y el agrupamiento no importan
Autoinversa(A⊕B)⊕B = AAplicar dos veces el mismo XOR deshace la operación
Distributiva sobre ANDA·(B⊕C) = A·B ⊕ A·CEl AND enmascara antes o después, igual

03 · XNOR

Verificador de igualdad

La XNOR es la negación del XOR: su salida vale 1 cuando las entradas son iguales. Se escribe Y = A⊙B (o ~(A⊕B)). Es una XOR con la bolita en la salida.

Tabla de la XNOR de dos entradas. Firma 1001, Σm(0, 3). Es la inversa fila a fila del XOR.
ABXORXNORLectura
0001Coinciden (los dos abajo)
0110No coinciden
1010No coinciden
1101Coinciden (los dos arriba)

XOR (74HC86)

Difiere → 1

Salida normal. Para alarmas de discrepancia, sumas, paridad, inversor controlado y detector de cambios.

XNOR

Coincide → 1

Para igualdad, cerraduras, comparación bit a bit. Equivale a un XOR más un inversor.

El drenador abierto no es solo un defecto: permite unir las salidas de varias XNOR y obtener un AND cableado de todas las igualdades. Así, cuatro XNOR de salida abierta y un pull-up comparan dos nibbles sin ninguna puerta AND extra.

04 · Aplicaciones

Seis usos que ya conocés sin saberlo

Para qué se usa el XOR en hardware y en software.
UsoExpresiónCómo funciona
Inversor controladoY = A⊕CC = 0 pasa; C = 1 invierte. Con ocho XOR y un control, invertís un byte entero (complemento a uno del Tema 5). Base de la resta en la ALU (Tema 27).
Alternar un bit (toggle)x ^= máscaraCada 1 de la máscara invierte el bit correspondiente; los 0 no lo tocan.
Detector de cambiocambio = nuevo ⊕ anteriorLos bits que valen 1 en el resultado son los que cambiaron desde la lectura anterior (interrupción por cambio de pin).
Igualdad / discrepanciaiguales = (A⊕B = 0)Si A⊕B da cero en todos los bits, los números son idénticos; cada 1 marca una diferencia.
Paridad y checksump = b₇⊕b₆⊕…⊕b₀La cadena de XOR da 1 con cantidad impar de unos. Detecta errores de un bit (Tema 26).
Suma sin acarreos = A⊕B, c = A·BEl sumador medio: XOR para la suma, AND para el acarreo (Tema 23).
Interruptores conmutados
La luz de pasillo del Tema 6 con dos interruptores (cada uno la invierte) es un XOR; con tres, la paridad de tres. Por eso la autoinversa importa: cada interruptor «deshace» al otro.
Código Gray
La conversión del Tema 5 a Gray es g = n ⊕ (n >> 1): cada bit se compara con su vecino y solo cambia un bit por paso.
Cifrado con clave
texto ⊕ clave lo ofusca; aplicar ⊕ clave otra vez lo recupera (autoinversa). Es la base de los cifrados de flujo, pero con una clave corta y repetida es trivial de romper: sirve para entender, no para proteger datos.
Recuperación de datos (RAID 5)
La paridad de un bloque es el XOR de los demás. Si un disco se pierde, su contenido es el XOR de los que quedan más la paridad: A⊕B⊕P = C.

05 · N bits

De un bit a muchos

Dos números de N bits son iguales si y solo si todos sus bits coinciden. Eso se traduce directamente en puertas: un XNOR por cada par de bits y un AND que junta los resultados.

N pares de bits→ N XNOR →un AND de N entradas→EQ = 1 si todos coinciden

Hay una versión equivalente que se lee mejor en software: A ^ B da un número cuyos bits en 1 marcan las posiciones donde difieren. Si ese número es cero, los dos son iguales. Y cuántos unos tiene es la distancia de Hamming: la cantidad de bits distintos.

Comparar 0xA5 con otros bytes.
ABA ⊕ BBits distintosConclusión
1010 01011010 01010000 00000Idénticos
1010 01011010 00010000 01001Difieren en el bit 2
1010 01010101 10101111 11118Complementarios
1010 01011010 10100000 11114Difiere todo el nibble bajo

Paridad: una cadena de XOR

Para saber si una palabra tiene cantidad par o impar de unos se encadenan XOR. Para N bits hacen falta N − 1 puertas y la señal atraviesa ⌈log₂ N⌉ niveles si se dispone en árbol, igual que en el AND del Tema 8. Si al enviar un byte agregás un noveno bit que hace que la cantidad total de unos sea par, el receptor hace el mismo XOR y detecta cualquier error de un solo bit.

06 · Chips reales

74HC86 y compañía

Chips relacionados con XOR y XNOR.
ChipContenidoPara qué
74HC864 XOR de 2 entradasEl estándar. Salida normal (0 o 1)
CD40304 XOR de 2 entradasSerie 4000: tensión de alimentación amplia, más lento
CD40774 XNOR de 2 entradasXNOR con salida normal
74HC2664 XNOR de 2 entradasSalida de drenador abierto: pull-up externo (verificar en la hoja de datos)
74HC280Generador/verificador de paridad de 9 bitsParidad par o impar de un bus
74HC688Comparador de igualdad de 8 bitsDecodificación de direcciones: XNOR + AND internos
74HC85Comparador de magnitud de 4 bitsMayor, menor o igual (Tema 25)
74HC283Sumador de 4 bitsXOR y AND encadenados (Tema 24)
Pines del 74HC86
Es idéntico al 74HC00 y al 74HC08 (Tema 8 y 9): entradas 1A, 1B y salida 1Y en los pines 1, 2, 3; 2A, 2B, 2Y en 4, 5, 6; GND en el 7; 3Y, 3A, 3B en 8, 9, 10; 4Y, 4A, 4B en 11, 12, 13; VCC en el 14. Aun así, confirmalo en la hoja de datos del fabricante.
Entradas sobrantes
Una entrada de XOR sin usar se ata a un valor que convierta la puerta en lo que querés: a 0 es un buffer (A⊕0 = A); a 1 es un inversor (A⊕1 = ~A). Una puerta entera sin usar lleva las dos entradas atadas a GND.
XOR con NAND
Con puertas universales (Tema 9) un XOR cuesta 4 NAND, es decir, un chip 74HC00 entero. Cuatro XOR dedicados caben en un solo 74HC86: otro caso de universal que no es óptimo.

07 · Simulador

Laboratorio: ¿coinciden?

El simulador compara dos números A y B bit a bit con una columna de puertas XOR (o XNOR). Cada columna es una puerta independiente; las posiciones donde los bits difieren se marcan en naranja, sin importar qué puerta elijas. Abajo ves el veredicto y cuántos bits distintos hay (la distancia de Hamming).

  • Arriba y en el medio: los bits de A y de B (amarillo = 1, turquesa = 0).
  • Cuadros intermedios: una puerta por columna; el cable que baja lleva el resultado.
  • Fila inferior: el resultado por bit. En naranja, las posiciones que difieren.
SIMULADOR 10

Comparador bit a bit

XOR · A=0xA5 B=0xA1 → 0x04

Comparador bit a bit con puertas XOR o XNOR Dos filas de bits, A y B, una puerta por columna y la fila de resultados. Las posiciones donde A y B difieren se marcan en naranja. UNA PUERTA POR COLUMNA · NARANJA = DIFIEREN
Resultado por bit0000 0100
Resultado en hexadecimal0x04
VeredictoDIFIEREN en 1 bit
Distancia de Hamming1 de 8 (impar)

A=1010 0101, B=1010 0001: difieren en el bit 2.

Recorrido guiado (6 minutos)

  1. 1
    Mirá el estado inicial: 0xA5 contra 0xA1.

    Siete columnas dan 0 (coinciden) y una da 1: el bit 2, en naranja. El XOR bit a bit es 0x04: un solo bit distinto, distancia de Hamming 1.

  2. 2
    Apretá «B = A».

    Todas las columnas se ponen en 0 y el veredicto dice IGUALES. Es la prueba de igualdad: A⊕B = 0.

  3. 3
    Apretá «B = ~A (invertir)».

    Todas las columnas difieren: el resultado es 0xFF y la distancia es 8 de 8. XOR con 0xFF es el complemento a uno.

  4. 4
    Pasá a XNOR sin tocar A ni B.

    Todos los bits del resultado se invierten, pero las posiciones naranja no cambian: siguen siendo las que difieren. El veredicto es el mismo; lo que cambia es qué valor significa «difiere» (0 en XNOR).

  5. 5
    Con XOR, apretá varias veces «Cambiar un bit de B».

    Cada clic agrega o quita una diferencia. La distancia de Hamming sube y baja de a uno. Fijate que la paridad de A⊕B (par o impar) alterna con cada cambio.

  6. 6
    Probá el ancho de 4 bits y armá A = 0xA y B = 0x9.

    1010 contra 1001: difieren en 2 posiciones (bits 1 y 0). Con dos errores la paridad vuelve a ser par: un bit de paridad no los detectaría, como advierte el Tema 26.

Preguntas para pensar

  1. Con A = 1010 0101 y B = 1010 0101, ¿qué da XOR bit a bit? ¿Y XNOR?
  2. ¿Qué B hace que A⊕B = 0xFF para cualquier A? ¿Y qué B hace que A⊕B = A?
  3. Si cambiás dos bits de B respecto de A, ¿cuál es la paridad de A⊕B?
  4. ¿Cuántas puertas XOR y cuántas AND/NOR hacen falta para comparar dos bytes?
Ver respuestas sugeridas
  1. XOR da 0000 0000 (ninguna diferencia). XNOR da 1111 1111 (todas coinciden).
  2. B = ~A (el complemento de A) da 0xFF. B = 0 da A⊕0 = A (elemento neutro).
  3. Par: dos unos suman 0 en la cadena de XOR. Por eso un bit de paridad no detecta dos errores.
  4. Ocho XOR (dos chips 74HC86) más un NOR de 8 entradas (o un AND de ocho XNOR). Un 74HC688 hace todo en un chip.

08 · Diferencia en código

Comparar, cambiar, verificar

Estos bloques demuestran las reglas del XOR, lo usan como inversor controlado y como alternador de bits, comparan números con la distancia de Hamming, detectan cambios y flancos en un puerto, calculan paridad y checksum (incluida la recuperación de un bloque perdido) y muestran el sumador medio, el código Gray y un cifrado XOR.

Python en tu navegador. Los bloques son editables: cambiá los valores y presioná «Ejecutar Python». La primera vez tarda unos segundos en cargar.

Paso 1: las dos puertas y sus reglas

from itertools import product


def xor_(a, b):
    return a ^ b


def xnor_(a, b):
    return 1 - (a ^ b)


filas = [(a, b) for a in (0, 1) for b in (0, 1)]
print("XOR: ", "".join(str(xor_(a, b)) for a, b in filas))
print("XNOR:", "".join(str(xnor_(a, b)) for a, b in filas))

REGLAS = {
    "neutro      A^0 = A":        lambda a, b, c: (a ^ 0) == a,
    "inversion   A^1 = ~A":       lambda a, b, c: (a ^ 1) == 1 - a,
    "anulacion   A^A = 0":        lambda a, b, c: (a ^ a) == 0,
    "complemento A^~A = 1":       lambda a, b, c: (a ^ (1 - a)) == 1,
    "asociativa  (A^B)^C":        lambda a, b, c: ((a ^ b) ^ c) == (a ^ (b ^ c)),
    "autoinversa (A^B)^B = A":    lambda a, b, c: ((a ^ b) ^ b) == a,
    "distributiva A&(B^C)":       lambda a, b, c: (a & (b ^ c)) == ((a & b) ^ (a & c)),
    "falsa:      A^B = A|B":      lambda a, b, c: (a ^ b) == (a | b),
}
for nombre, regla in REGLAS.items():
    ok = all(regla(*f) for f in product((0, 1), repeat=3))
    print(f"{'vale' if ok else 'FALLA'}  {nombre}")

XOR: 0110 y XNOR: 1001. Las siete reglas valen en las 8 filas; la última (XOR no es OR) falla en la fila 11.

Paso 2: inversor controlado y alternar bits

def invertir_si(x, c, bits=8):
    return x ^ (((1 << bits) - 1) if c else 0)


x = 0b01100110
print(f"x               = {x:08b}")
print(f"invertir_si c=0 = {invertir_si(x, 0):08b}   (pasa igual)")
print(f"invertir_si c=1 = {invertir_si(x, 1):08b}   (complemento a uno)")

flags = 0b0000
LED1, LED2, LED3 = 0b001, 0b010, 0b100
for nombre, mascara in (("LED1", LED1), ("LED3", LED3), ("LED1", LED1)):
    flags ^= mascara
    print(f"alternar {nombre}: {flags:03b}")

a, b = 0x3C, 0xA5                    # intercambio sin variable temporal
a ^= b
b ^= a
a ^= b
print(f"swap con XOR: a=0x{a:02X} b=0x{b:02X}")

Con c = 1 se invierte el byte entero, con c = 0 queda igual. Alternar el mismo LED dos veces lo deja como estaba (autoinversa). El intercambio con XOR funciona justamente por esa propiedad.

Paso 3: igualdad de N bits y distancia de Hamming

def comparar(a, b, bits=8):
    mascara = (1 << bits) - 1
    d = a ^ b                            # 1 en cada posición donde difieren
    xnor = ~d & mascara                  # 1 en cada posición donde coinciden
    iguales = xnor == mascara            # el AND de todos los XNOR
    hamming = bin(d).count("1")
    print(f"{a:08b} vs {b:08b}  XOR={d:08b}  "
          f"{'IGUALES' if iguales else 'difieren'}  Hamming={hamming}")
    return hamming


comparar(0xA5, 0xA5)
comparar(0xA5, 0xA1)
comparar(0xA5, 0x5A)
comparar(0xA5, 0xAA)

Distancias 0, 1, 8 y 4. Igualdad es «todos los XNOR en 1» o, equivalente, «A ^ B == 0».

Paso 4: detector de cambios y flancos de un puerto

lecturas = [0b0001, 0b0011, 0b0010, 0b0010, 0b1010]

previo = lecturas[0]
print("   lectura  cambio  subió  bajó")
for nuevo in lecturas[1:]:
    cambio = previo ^ nuevo
    subio = cambio & nuevo          # cambió y ahora vale 1
    bajo = cambio & previo          # cambió y antes valía 1
    print(f"   {nuevo:04b}     {cambio:04b}    {subio:04b}   {bajo:04b}")
    previo = nuevo

En cada paso, XOR marca qué pines cambiaron; AND con el valor nuevo separa los flancos de subida y AND con el anterior, los de bajada. Es lo que hace en hardware la «interrupción por cambio de pin».

Paso 5: paridad, checksum y recuperación

from functools import reduce


def paridad_par(byte):
    # bit que, agregado al byte, deja una cantidad par de unos
    return reduce(lambda p, i: p ^ ((byte >> i) & 1), range(8), 0)


for c in "ACb":
    v = ord(c)
    print(f"{c!r} = {v:08b}  bit de paridad par = {paridad_par(v)}")

recibido = 0b01000001 ^ 0b00000100          # 'A' con un bit dañado
print("¿error detectado?", paridad_par(recibido) != paridad_par(0b01000001))


def checksum_nmea(cuerpo):
    return f"{reduce(lambda x, c: x ^ ord(c), cuerpo, 0):02X}"


print("checksum de 'GPGLL':", checksum_nmea("GPGLL"))

d1, d2, d3 = 0x3C, 0xA5, 0x0F
p = d1 ^ d2 ^ d3                              # bloque de paridad (RAID 5)
print(f"paridad = 0x{p:02X}; si se pierde d2, d2 = 0x{p ^ d1 ^ d3:02X}")

Con 'A' (dos unos) la paridad par es 0; con 'C' (tres unos), 1. Un bit dañado cambia la paridad y se detecta. El checksum de «GPGLL» es 50. Con la paridad de los demás bloques se reconstruye el perdido: 0xA5.

Paso 6: sumador medio, código Gray y cifrado

print("A B | suma acarreo")
for a in (0, 1):
    for b in (0, 1):
        print(a, b, "|", a ^ b, "   ", a & b)

print()
for n in range(8):
    g = n ^ (n >> 1)
    print(f"{n} {n:03b} -> Gray {g:03b}")

clave = 0x5A
texto = "HOLA"
cifrado = bytes(ord(c) ^ clave for c in texto)
descifrado = "".join(chr(b ^ clave) for b in cifrado)
print(cifrado.hex(" "), "->", descifrado)

XOR da la suma y AND el acarreo (1+1 = «10»). En Gray cada fila difiere de la anterior en un solo bit. «HOLA» pasa a 12 15 16 1B y vuelve igual: aplicar el mismo XOR dos veces es la identidad.

09 · Analogía de programador

!= y == con silicio

El mismo concepto, en dos mundos.
En softwareEn electrónica digital
a != b con booleanosUna puerta XOR
a == b con booleanosUna puerta XNOR
a ^ b con enterosOcho XOR en paralelo, una por bit
a == b con enteros (comparación completa)XNOR por bit + AND que junta todos (74HC688)
flags ^= BANDERA (alternar)XOR con una máscara: inversor controlado por bit
Comparar dos strings carácter por carácterCascada de igualdades unidas por un AND
Checksum XOR (NMEA, algunos protocolos seriales)Una cadena de XOR sobre los datos
Paridad en RAID 5 y en el bit de paridad de una UARTXOR de los demás bits o bloques
diff entre dos archivos o dos versionesXOR bit a bit: cada 1 es una diferencia
  1. 1
    XOR = !=.

    Verdadero cuando difieren. Es la comparación elemental, hecha puerta.

  2. 2
    XNOR = ==.

    Verdadero cuando coinciden: una cerradura que abre con el código exacto.

  3. 3
    Cascada = comparar strings.

    La igualdad total es el AND de las igualdades por posición, como comparar char por char. La diferencia es que en el hardware se comparan todas a la vez.

Una advertencia sobre el lenguaje: en C, ^ es el XOR bit a bit y no la potencia; y != sobre enteros compara el valor completo, no bit por bit. El primero devuelve «dónde» difieren; el segundo, solo «si».

10 · Comprensión

Confusiones frecuentes

«XOR suma»

Suma a medias: 1⊕1 = 0 pierde el acarreo, que se calcula con un AND aparte. La suma completa necesita XOR y AND (Tema 23). Con N bits encadenados, el XOR da la paridad, no la suma.

«Un OR común es exclusivo»

El OR lógico incluye la fila 11 (da 1): «café o té» en lógica acepta ambos. Solo el XOR descarta el caso en que los dos valen 1.

«XOR de tres entradas me dice si no son todas iguales»

No: el XOR de tres da 1 con una cantidad impar de unos, incluyendo 111. Para «no todas iguales» hace falta ~(A·B·C + ~A·~B·~C). XOR encadenado es paridad, no comparación.

«XNOR = XOR con un NOT y listo»

Lógicamente sí. Eléctricamente hay que mirar el chip: algunos XNOR tienen drenador abierto y piden un pull-up. Sin la resistencia, la salida nunca sube.

«La paridad detecta cualquier error»

Detecta una cantidad impar de bits errados. Con dos bits invertidos la paridad no cambia y el error pasa inadvertido. Es un detector, no un corrector.

«El cifrado XOR es seguro»

Con una clave corta y repetida se rompe enseguida: basta conocer un trozo del texto para recuperar la clave (texto ⊕ cifrado = clave). Aprendé la propiedad, pero no protejas nada con eso.

«A ^ B == 0 y A == B son cosas distintas»

Son lo mismo para números enteros: el XOR bit a bit es 0 si y solo si todos los bits coinciden. La primera es la forma en que el hardware lo calcula.

11 · Práctica guiada

Ejercicios de coincidencia

Ejercicio 1: alarma de discrepancia

Dos sensores redundantes deben coincidir; si difieren, hay alarma. ¿Qué puerta y qué chip? Si en lugar de dos fueran tres sensores, ¿sirve un XOR de tres entradas?

Ver solución razonada

Para dos sensores, XOR (74HC86): 01 y 10 dan 1 y activan la alarma; 00 y 11 quedan en 0 (ambos abajo también es «coinciden»). Para tres, el XOR de tres no sirve: da 1 con 111 (cantidad impar) y 0 con dos unos. La alarma es «no todos iguales»: ~(A·B·C + ~A·~B·~C), es decir, Σm(1, 2, 3, 4, 5, 6).

Ejercicio 2: igualdad de dos números de 2 bits

Compará A = A₁A₀ con B = B₁B₀. ¿Cuántas puertas y qué chips usás con XNOR + AND? ¿Y con XOR + NOR?

Ver solución razonada

EQ = (A₁⊙B₁)·(A₀⊙B₀): dos XNOR y un AND, 3 puertas. Con XOR (más fácil de conseguir) sale EQ = NOR(A₁⊕B₁, A₀⊕B₀): dos XOR del 74HC86 y una NOR del 74HC02. Mismo resultado, otra distribución de chips. Verificá ambos con comparar().

Ejercicio 3: inversor controlado

Un nibble x = 0110 pasa por cuatro XOR con un control común C. ¿Cuánto vale la salida con C = 0 y con C = 1? ¿Para qué sirve ese circuito en una resta?

Ver solución razonada

Con C = 0: 0110 (pasa igual). Con C = 1: 1001 (invertido, complemento a uno). En la resta a − b = a + (~b + 1), el control C = 1 invierte b y además se pone el acarreo de entrada en 1. El mismo sumador suma o resta según C (Tema 27).

Ejercicio 4: bit de paridad

El byte 0x6B se envía con un noveno bit de paridad par. ¿Cuánto vale ese bit? ¿Cuántas puertas XOR hacen falta para calcularlo y cuántos niveles tiene un árbol? Verificá con paridad_par().

Ver solución razonada

0x6B = 0110 1011: cinco unos (cantidad impar), así que el bit de paridad es 1 y el total queda en seis. Para 8 bits hacen falta 7 XOR en 3 niveles (igual que un AND de ocho entradas con puertas de dos). El receptor repite el cálculo sobre los 9 bits y espera 0.

Ejercicio 5: montar el comparador

Armá un 74HC86 con dos pulsadores con pull-down y un LED. Medí las cuatro filas. ¿Qué hacés con las otras tres puertas del chip?

Ver solución razonada

Debe dar 0110. Si el LED queda tenue o aparece una fila errónea: alimentación (pin 14 a VCC y pin 7 a GND), pull-down en los pulsadores (sin ellos la entrada flota) y la polaridad del LED con su resistencia. Las tres puertas sin usar llevan sus dos entradas atadas a GND (salida fija en 0), nunca al aire.

Ejercicio 6: detector de cambios

Un puerto de 4 bits entrega las lecturas 0001, 0011, 0010, 0010. En cada paso, ¿qué pines cambiaron y cuáles subieron o bajaron? Verificá con el Paso 4.

Ver solución razonada

0001 → 0011: cambio = 0010, subió el pin 1. 0011 → 0010: cambio = 0001, bajó el pin 0. 0010 → 0010: cambio = 0000, nada. El XOR localiza los pines que cambiaron; el AND con el valor nuevo o el anterior distingue subida de bajada.

12 · Síntesis

Ideas para recordar

  • XOR = 0110 (difieren, Σm(1,2)); XNOR = 1001 (coinciden, Σm(0,3)). El XOR es un OR sin la fila 11.
  • Reglas: A⊕0 = A (neutro), A⊕1 = ~A (inversión), A⊕A = 0 y (A⊕B)⊕B = A (autoinversa).
  • A⊕C es un inversor controlado: pasa con C = 0, invierte con C = 1.
  • Igualdad de N bits = XNOR por bit + AND, o A⊕B = 0. Los 1 de A⊕B son las posiciones que difieren; su cantidad es la distancia de Hamming.
  • XOR en cadena da la paridad (impar = 1): detecta errores de un bit, no corrige y se burla de los dobles.
  • XOR + AND es el sumador medio: suma sin acarreo y acarreo.
  • 74HC86 (4 XOR, mismo pinout que el 00); el XNOR dedicado puede ser de drenador abierto: pull-up. Un XOR con NAND cuesta 4 puertas.
  • Usos: detección de cambios, toggle de bits, checksum, RAID, código Gray, cifrado de juguete.

¿Listo para el Tema 11?

Podés avanzar si sos capaz de responder esto sin mirar:

  • Escribir de memoria las firmas de XOR y XNOR.
  • Explicar qué le hace un XOR a un bit cuando el otro vale 0 y cuando vale 1.
  • Armar un comparador de dos números de 4 bits con puertas.
  • Decir qué indica A ^ B y cómo se obtiene la cantidad de bits distintos.
  • Calcular el bit de paridad par de un byte y decir qué errores no detecta.
  • Explicar por qué el XOR de tres sensores no sirve para detectar discrepancia.

Con las puertas lógicas completas, pasamos de los símbolos a los cables: el mundo real no es limpio. En el próximo tema, botones y rebotes, lo que pasa cuando un contacto mecánico se cruza con tu lógica perfecta.