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ógica | C | Nota |
|---|---|---|
NOT A | !a | ~a invierte todos los bits |
A AND B | a && b | a & b es bit a bit |
A OR B | a || b | a | b es bit a bit |
A XOR B | !a != !b | a ^ b es bit a bit; normaliza primero |
A -> B | !a || b | No hay operador de implicación |
A <-> B | !a == !b | Normaliza antes de comparar |
TRUE, FALSE | distinto de cero, 0 | true/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
- Operadores lógicos en Java: &&, ||, ! frente a &, | y ^
- Operadores lógicos en JavaScript: &&, ||, !, truthiness y precedencia
- & y | simples son operaciones bit a bit en la mayoría de lenguajes
- ~ es NOT bit a bit en código y NOT lógico en algunos libros
- ^ significa XOR en C, Java y Python, no AND ni potencia
- La precedencia cambia entre lenguajes: not a == b en Python
- Precedencia de operadores en lógica booleana: NOT, luego AND, luego XOR, luego OR
Lenguajes
- Símbolos y notaciones de la lógica booleana: NOT, AND, OR en palabras, código y matemáticas
- Operadores booleanos en Python: and, or, not, precedencia y errores comunes
- Operadores lógicos en JavaScript: &&, ||, !, truthiness y precedencia
- Lógica booleana en SQL: AND, OR, NOT y la trampa de NULL (lógica trivaluada)
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.