Introducción.
Estoy conciente que esto es un foro, así que esto debe tener formato de lectura ligera.
El objetivo es poderles proporcionar conceptos explicados a su área (la programación), y con un poco de suerte poderles ayudar a desatollar un poquito mas su lógica.
Por ultimo, aunque la idea es usar C-99, muchos conceptos serán explicados
con pseudo-codigo, para no perder tiempo.
Contenido del capitulo:
1.- Lógica Proposicional y funcionamiento de los bits.
2.- Operadores Lógicos y Operadores a Nivel de Bits
3.- Ejemplos de Bitmasking
4.- Aplicaciones de esto en la programación (ejemplos).
Lógica Proposicional:
En el capítulo anterior vimos cómo un programa toma decisiones usando lógica booleana con operadores como && (AND), || (OR) y ! (NOT). Esas expresiones evalúan condiciones completas y nos devuelven un simple “verdadero” o “falso”. Estas expresiones evalúan condiciones completas y nos devuelven un simple “verdadero” o “falso”, como sabrán los operadores booleanos son fundamentales.
Pero como ustedes sabrán, en el fondo, la computadora no entiende de “verdades” filosóficas; entiende de voltajes, de encendido y apagado. Ellas solo entiende de ceros y unos, tenemos que transformar el lenguaje natural a un lenguaje utilizando la lógica.
Aquí es donde la lógica entra en juego, concretamente la lógica proposicional es la que brilla, ya que la lógica es una rama muy extensa de las matemáticas, y esta específicamente es la que nos proporciona la afirmación que puede ser verdadera (1) o falsa (0). No hay puntos intermedios. Y cuando llevamos estas operaciones matemáticas directamente a la memoria de la computadora.
Operadores Lógicos
En C el lenguaje elegido para este curso, y en casi cualquier lenguaje derivado de él, existe una diferencia monumental entre comparar dos expresiones lógicas y operar directamente sobre los bits de un registro, esto lo digo para hacer una comparación entre los…
operadores Lógicos y los operadores a Nivel de Bits, esto es importante por que como linuxeros tenemos que aspirar, a cada vez entender mas el funcionamiento del bajo nivel, continuemos ahora si con los operadores…
Lógicos (&&, ||, !): Trabajan con el concepto de que cualquier cosa distinta de cero es true y cero es false.
Bitwise (&, |, ~, ^): Trabajan aplicando la tabla de verdad matemática bit por bit (columna por columna) en la representación binaria de los números.
Vamos a ver las equivalencias matemáticas aplicadas al hardware directo:
Conjunción / AND (&): Solo es 1 si ambos bits son 1.
Esta nos sirve para comprobar si dos o más condiciones son verdaderas al mismo tiempo.
if edad > 12 and altura > 1.40:
print("Si puedes subir a la atracción!")
else:
print ("Estas muy joven y enano!")
Disyunción / OR (|): Es verdadero si al menos uno de los bits es verdadero.
Sirve para evaluar si al menos una de dos o más condiciones se cumple.
Si es_estudiante es True o edad < 12 es True, el bloque if se ejecuta.
XOR / OR Exclusivo (^): Es 1 solo si los bits son diferentes.
No se me ocurre ningún ejemplo concreto, esta nos sirve para intercambiar
el valor de dos variables numéricas sin necesidad de crear una tercera variable temporal.
a = 5 # En binario: 0101
b = 9 # En binario: 1001
# Aplicamos XOR en tres pasos para intercambiarlas
a = a ^ b
b = a ^ b
a = a ^ b
Negación / NOT (~): Invierte todos los bits (1 a 0 y 0 a 1).
Esta es muy conocida, nos ayuda a invertir el valor de verdad de una condición.
Un ejemplo muy común seria para verificar si un usuario no ha iniciado sesión
para mostrarle un botón de acceso, con un simple if-else.
if not usuario_autenticado:
print(“Por favor, inicia sesión para continuar.”)
else:
print(“Bienvenido al sistema.”)
Llevando los operadores al código:
Vamos a plantear un ejemplo cotidiano, nada muy loco, imagina el siguiente escenario:
estás programando la configuración de una aplicación y quieres guardar las preferencias del usuario de la forma más ligera posible. En lugar de desperdiciar memoria con múltiples variables, guardamos 8 interruptores en un solo byte (8 bits), (estoy cociente que muchos lenguajes y sandbox ya hacen esto automáticamente, pero solo por diversión)
Cada bit representa una proposición simple (¿Verdadero o Falso?):
- Bit 0: ¿Modo oscuro activado?
- Bit 1: ¿Notificaciones activadas?
- Bit 2: ¿Sonido activado?
- Bit 3: ¿Ahorro de batería activado?
#include <stdio.h>
#include <stdint.h> // Define uint8_t (exactamente 8 bits)
// Definimos las "máscaras" de cada ajuste (potencias de 2 en binario)
#define MODO_OSCURO 0x01 // Bit 0: 0000 0001 (1 en decimal)
#define NOTIFICACIONES 0x02 // Bit 1: 0000 0010 (2 en decimal)
#define SONIDO_ACTIVO 0x04 // Bit 2: 0000 0100 (4 en decimal)
#define MODO_AHORRO 0x08 // Bit 3: 0000 1000 (8 en decimal)
int main(void) {
// Estado inicial: El usuario tiene activo el Modo Oscuro y el Sonido (1 + 4 = 5)
// En memoria binaria: 0000 0101
uint8_t ajustes = MODO_OSCURO | SONIDO_ACTIVO;
printf("Ajustes iniciales (decimal): %d\n", ajustes);
// 1. PARA ENCENDER: El usuario entra a la app y activa las notificaciones.
// Usamos el operador OR (|) para poner el Bit 1 en 1 sin alterar los demás.
ajustes = ajustes | NOTIFICACIONES; // Pasa a 0000 0111 (7 en decimal)
printf("Despues de activar notificaciones (OR): %d\n", ajustes);
// 2. PARA APAGAR: El usuario desactiva el Modo Oscuro.
// Usamos AND (&) combinado con NOT (~).
// ~MODO_OSCURO invierte los bits (1111 1110), forzando el Bit 0 a cero.
ajustes = ajustes & ~MODO_OSCURO; // Pasa a 0000 0110 (6 en decimal)
printf("Despues de apagar modo oscuro (AND NOT): %d\n", ajustes);
// 3. PARA ALTERNAR (Toggle): El usuario presiona el botón rápido de Sonido/Silencio.
// Si estaba encendido lo apaga; si estaba apagado lo enciende.
// Usamos XOR (^). Como el sonido estaba en 1, pasa a 0.
ajustes = ajustes ^ SONIDO_ACTIVO; // Pasa a 0000 0010 (2 en decimal)
printf("Despues de alternar/silenciar sonido (XOR): %d\n", ajustes);
return 0;
}
Conclusion
Aunque no sea muy necesario a corto plazo, entender la lógica proposicional es la llave para entender como funciona el hardware, pero ya bien. Cuando comprendes que cada compuerta lógica y cada operador bit a bit, y cuando estes programando pienses en ellos, tu forma de programar cambia por completo.
¿Qué debes de recordar de este tema?
- La computadora es matemática pura
- No confundas Lógico con Bit
- La navaja suiza del Bitmasking aprendete OR, AND, NOT, XOR.


