Saltar al contenido

Operadores lógicos en C: lógicos frente a bit a bit

C tiene operadores lógicos que producen 0 o 1 y operadores bit a bit que actúan sobre cada bit, con grafías parecidas y precedencia distinta. Cualquier valor distinto de cero es verdadero, lo que hace de if (x = 1) y a & b == c los dos deslices clásicos.

LógicaCNota
NOT A!a~a invierte todos los bits
A AND Ba && ba & b es bit a bit
A OR Ba || ba | b es bit a bit
A XOR B!a != !ba ^ b es bit a bit; normaliza primero
A -> B!a || bNo hay operador de implicación
A <-> B!a == !bNormaliza antes de comparar
TRUE, FALSEdistinto de cero, 0true/false con <stdbool.h> o C23

!a, a && b y a || b son los operadores lógicos; tratan cualquier operando distinto de cero como verdadero y producen exactamente 1 o 0. ~a, a & b, a | b y a ^ b son bit a bit: 5 && 2 es 1, pero 5 & 2 es 0, porque los enteros no comparten ningún bit activo. Desde C99 existe _Bool (escrito bool con la cabecera, y palabra clave en C23), y convertir a él normaliza cualquier valor distinto de cero a 1; !!x hace lo mismo en código antiguo.

La precedencia es donde C muerde. ! liga con más fuerza; luego los operadores aritméticos y de desplazamiento; luego las comparaciones == y !=; luego &, ^, | en ese orden; luego &&; luego ||. Así que a & b == c es a & (b == c), que casi nunca es lo que se quería, y a == 1 && b == 2 funciona solo porque == está por encima de &&. La asignación es la de menor rango, así que if (x = 1) asigna y evalúa el valor 1, que siempre es verdadero.

Tangibool no exporta C. Traduce con la tabla, pon entre paréntesis cada expresión mixta y conserva la tabla de verdad del motor como oráculo de las pruebas. El analizador rechaza &, |, ^ y ~ en la entrada precisamente porque una expresión de C que los use cambiaría de significado al leerse como lógica; con &&, || y ! una condición de C suele ser una fórmula válida tal cual.

El error habitual

Comparar indicadores con == sin normalizar. Si una función devuelve 1 para verdadero y otra devuelve 4 (un bit activo), los dos son verdaderos en C, pero flag1 == flag2 es falso. Compara !!flag1 == !!flag2, o convierte a bool en la frontera.

Preguntas

¿a ^ b sirve como XOR lógico?

Solo cuando los dos operandos ya son 0 o 1. Sobre enteros arbitrarios es bit a bit, así que 2 ^ 4 es 6, que es verdadero, aunque las dos entradas eran verdaderas y un XOR lógico debería dar falso. Usa !a != !b.

¿Por qué el motor rechaza ~?

Porque ~ es el complemento bit a bit en C y sus parientes, y ~1 es -2, que es verdadero, no falso. El analizador ofrece NOT como corrección en lugar de adivinar qué significado querías.

Relacionado

Véase también

Lenguajes

Generado a partir del motor de Tangibool, semántica tangibool-semantics/1, motor 1.0.0, compilación . Cada tabla, mapa, simplificación y veredicto de estas páginas lo calculó el motor de Tangibool al compilar el sitio, y cada afirmación la volvió a comprobar el mismo verificador exacto que usa la app. Los límites se indican donde aplican. © 2026 Foreranger LTD.