Sistema binario y pensamiento computacional
Al finalizar este tema
Comprenderá por qué las computadoras utilizan el sistema binario, podrá realizar conversiones entre los sistemas decimal y binario, y podrá explicar cómo se representan internamente el texto y los colores.
¿Por qué las computadoras solo usan 0 y 1?
El componente fundamental de una computadora, el transistor, solo tiene dos estados: corriente fluyendo (1) o corriente sin fluir (0). Miles de millones de transistores se agrupan para formar la CPU, y cada uno representa un 0 o un 1.
Los humanos usamos el sistema decimal porque tenemos diez dedos. Las computadoras usan el sistema binario porque tienen dos estados. Es así de simple.
Decimal vs. Binario
En el sistema decimal, 254 es:
2 × 10² + 5 × 10¹ + 4 × 10⁰
= 200 + 50 + 4
= 254En el sistema binario, 11111110 es:
1×2⁷ + 1×2⁶ + 1×2⁵ + 1×2⁴ + 1×2³ + 1×2² + 1×2¹ + 0×2⁰
= 128 + 64 + 32 + 16 + 8 + 4 + 2 + 0
= 254Funciona bajo el mismo principio. En lugar de multiplicar por potencias de 10 en cada posición, se multiplica por potencias de 2.
Conversión con Python
# Decimal → binarioprint(bin(254)) # '0b11111110'print(bin(42)) # '0b101010'
# Binario → decimalprint(int('11111110', 2)) # 254print(int('101010', 2)) # 42
# Hexadecimal (forma compacta del binario)print(hex(254)) # '0xfe'print(int('fe', 16)) # 2540b es el prefijo para el sistema binario y 0x para el sistema hexadecimal.
Bits y bytes
- Bit: 0 o 1, la unidad mínima de información
- Byte: 8 bits = 1 byte
1 bit → 2 valores (0 o 1)
2 bits → 4 valores (00, 01, 10, 11)
3 bits → 8 valores (000 ~ 111)
8 bits → 256 valores (00000000 ~ 11111111)El número de valores que se pueden representar con n bits es 2ⁿ.
| Unidad | Tamaño | Uso aproximado |
|---|---|---|
| 1 byte | 8 bits | 1 carácter (alfabeto latino) |
| 1 KB | 1.024 bytes | Archivo de texto corto |
| 1 MB | 1.024 KB | 1 foto de alta resolución |
| 1 GB | 1.024 MB | 1 película (SD) |
| 1 TB | 1.024 GB | Disco duro de gran capacidad |
Representación binaria del texto: ASCII y Unicode
Las computadoras no tienen el concepto de "carácter". Todos los caracteres se asocian a números.
ASCII: 128 caracteres (alfabeto latino)
# Carácter → código ASCIIprint(ord('A')) # 65print(ord('a')) # 97print(ord('0')) # 48print(ord(' ')) # 32
# Código ASCII → carácterprint(chr(65)) # 'A'print(chr(97)) # 'a'print(chr(48)) # '0''A' = 65 = 01000001 (binario)
'B' = 66 = 01000010
'a' = 97 = 01100001
'0' = 48 = 00110000ASCII utiliza 7 bits para representar 128 caracteres: letras mayúsculas y minúsculas del alfabeto inglés, números y símbolos especiales. Sin embargo, no puede representar el coreano, el japonés ni el chino.
Unicode — Caracteres de todo el mundo
print(ord('ñ')) # 241print(ord('á')) # 225print(hex(ord('ñ'))) # '0xf1'
print(chr(241)) # 'ñ'print(chr(127829)) # '🍕' (emoji de pizza)
# Codificación UTF-8 — comprobar el número de bytesprint('A'.encode('utf-8')) # b'A' — 1 byteprint('ñ'.encode('utf-8')) # b'\xc3\xb1' — 2 bytesprint('🍕'.encode('utf-8')) # b'\xf0\x9f\x8d\x95' — 4 bytesUnicode incluye más de 140.000 caracteres. UTF-8 es un método de codificación de Unicode que utiliza 1 byte para el inglés, 3 bytes para el coreano y 4 bytes para los emojis.
Representación binaria del color: RGB
Todos los colores de la pantalla son una combinación de tres valores: rojo (R), verde (G) y azul (B). Cada valor tiene un rango de 0~255 (1 byte).
# Valores RGB → código de color hexadecimalr, g, b = 255, 128, 0hex_color = f"#{r:02x}{g:02x}{b:02x}"print(hex_color) # #ff8000 (orange)
# Hexadecimal → RGBhex_str = "ff8000"r = int(hex_str[0:2], 16) # 255g = int(hex_str[2:4], 16) # 128b = int(hex_str[4:6], 16) # 0| Color | R | G | B | Hexadecimal |
|---|---|---|---|---|
| Rojo | 255 | 0 | 0 | #ff0000 |
| Verde | 0 | 255 | 0 | #00ff00 |
| Azul | 0 | 0 | 255 | #0000ff |
| Blanco | 255 | 255 | 255 | #ffffff |
| Negro | 0 | 0 | 0 | #000000 |
Al escribir #ff8000 en CSS, esto representa R=255, G=128, B=0 en formato hexadecimal. Con 8 bits por canal × 3 canales = 24 bits, se pueden representar aproximadamente 16,77 millones de colores.
¿Cómo se representan los números negativos? — Complemento a dos
El sistema binario solo utiliza 0 y 1; ¿cómo se representan los números negativos? Las computadoras utilizan el complemento a dos (Two's Complement).
Tomando como referencia 8 bits, veamos 5 y -5:
5 = 00000101
-5 = 11111011Cómo obtener el complemento a dos: invierta todos los bits (0→1, 1→0) y luego sume 1.
5 = 00000101
invertir = 11111010
+1 = 11111011 → este es -5# Comprobación en Pythonprint(bin(5)) # 0b101print(bin(-5 & 0xff)) # 0b11111011 (con 8 bits)
# Ventaja del complemento a dos: el mismo circuito de suma permite restar# 5 + (-5) = 00000101 + 11111011 = 100000000# Se descarta el noveno bit → 00000000 = 0 (correcto)Gracias a este método, la CPU puede realizar restas utilizando únicamente el circuito de suma, sin necesidad de un circuito de resta independiente.
Rango representable con complemento a dos de 8 bits: -128 ~ +127 (un total de 256 valores).
Operaciones bit a bit: manipulación directa de 0 y 1
En programación, existen operaciones que permiten manipular los bits directamente.
a = 0b1100 # 12b = 0b1010 # 10
# AND — 1 solo si ambos bits son 1print(bin(a & b)) # 0b1000 (8)
# OR — 1 si al menos uno de los bits es 1print(bin(a | b)) # 0b1110 (14)
# XOR — 1 si los bits son diferentesprint(bin(a ^ b)) # 0b0110 (6)
# NOT — invierte los bitsprint(bin(~a & 0xf)) # 0b0011 (3)
# Shift — desplaza los bits a la izquierda o a la derechaprint(a << 1) # 24 (12 × 2)print(a >> 1) # 6 (12 ÷ 2)El desplazamiento a la izquierda (<<) equivale a ×2, y el desplazamiento a la derecha (>>) equivale a ÷2. Debido a que son más rápidos que la multiplicación/división, se utilizan en código de bajo nivel donde el rendimiento es crucial.
Práctica — Gestión de permisos mediante bitmasks
Los permisos de archivos de Linux (chmod 755) funcionan mediante operaciones de bits.
READ = 0b100 # 4WRITE = 0b010 # 2EXECUTE = 0b001 # 1
# Configurar permisos (combinarlos con OR)user_perm = READ | WRITE | EXECUTE # 0b111 = 7group_perm = READ | EXECUTE # 0b101 = 5other_perm = READ | EXECUTE # 0b101 = 5
print(f"chmod {user_perm}{group_perm}{other_perm}") # chmod 755
# Comprobar permisos (evaluarlos con AND)has_write = bool(user_perm & WRITE) # Truehas_write_g = bool(group_perm & WRITE) # FalseSignificado de chmod 755: propietario (7=rwx), grupo (5=r-x), otros (5=r-x). Cada número es la representación decimal de 3 bits.
Resumen clave
| Concepto | Resumen |
|---|---|
| Sistema binario | Representa todos los números con 0 y 1. El lenguaje fundamental de las computadoras. |
| Bit | La unidad mínima de información (0 o 1). |
| Byte | 8 bits. Rango de valores de 0 a 255. |
| ASCII | Asigna números a caracteres del alfabeto inglés (7 bits, 128 caracteres). |
| Unicode | Caracteres de todo el mundo (más de 140.000). Se almacena mediante UTF-8. |
| RGB | Representa colores mediante tres valores (0~255). 24 bits = 16,77 millones de colores. |
Al programar, es poco común realizar cálculos binarios directamente. Sin embargo, comprender que "las computadoras representan todo como números, y esos números se expresan con 0 y 1" permite asimilar naturalmente conceptos como el tamaño de archivo, errores de codificación, códigos de color y bitmasks. Entender el complemento a dos ayuda a comprender por qué ocurre el desbordamiento de enteros (integer overflow), y comprender las operaciones a nivel de bits explica por qué el sistema de permisos (chmod) utiliza 777.