En cualquier curso de CCNA se aborda el problema de hacer conversión entre binario, decimal y hexadecimal. En ésta entrada vamos a contextualizar un poco el tema y exploraremos un poco la teoría. Disfrútenlo.
Introducción: dónde usamos conversiones
Si han venido leyendo mis últimas publicaciones ya han leído sobre direcciones MAC, IP y máscaras, las tres son números binarios de gran tamaño (48 bits y 32bits) que se escriben en decimal y hexadecimal para facilitar a los humanos su manipulación. Cuando se va adquiriendo experiencia se comprende que para entender las redes es indispensable comprender la conversión de decimal a binario y viceversa. Hay muchos cálculos que se basan en esta habilidad, por ejemplo cómo diseñar un esquema de direccionamiento (pool de direcciones IP para asignar en varios segmentos de red), agrupar conjuntos de direcciones en una IP ficticia que resume las IPs reales o mapear una IP de multicast con una MAC de multicast entre muchas otras operaciones. Siendo mucho más prácticos, en el examen de certificación habrán muchas preguntas que requieren hacer cálculos que si no hacemos rápidamente nos pueden consumir el tiempo para terminarlo y por ende reprobemos.
Hoy en día también es indispensable saber de IPv6, que en vez de 32 bits usa 128 y ya no usa binario sino hexadecimal. No se asusten, en lo personal, me parece más fácil trabajar con IPv6 que con IPv4. Otro contexto en el cual es importantísimo tener mucha habilidad usando conversión numérica es en las ACLs, que a nivel de CCNA se usa para filtrar tráfico pero a niveles más avanzados tienen muchas aplicaciones. En fin, para trabajar en redes de datos o certificarse es indispensable no sólo comprender los sistemas numéricos sino ser hábil en ellos. No es tan grave, verán que es fácil y que existen muchos atajos con los cuales no es necesario estar haciendo cálculos si nos aprendemos unos cuantos números especiales y los sabemos usar.
Direcciones IPs, Máscaras y subredes
Una dirección IP son 32 bits que identifican un host, una red o en ocasiones grupos de hosts (dependiendo de su estructura). Éstos 32 bits se escriben en decimal y separados por puntos como ya sabemos: 192.168.0.1, a ésta forma de escribir direcciones IP se le conoce como notación decimal punteada. En ésta dirección tenemos 4 grupos de 8 bits, que llamaremos octetos o Bytes. 2^8=256, es decir, cada dígito de la IP cuenta hasta 256, pero como la cuenta comienza en 0, el nro máximo de un octeto es 255. Sí, piénselo un momento XD
Entonces una IP son 4 octetos, escritos en decimal y en teoría diríamos que las direcciones IP van desde el nro 0.0.0.0 hasta el 255.255.255.255, imaginemos que los vemos en binario:
desde 00000000.00000000.00000000.00000000 hasta 11111111.11111111.11111111.11111111
Esos son muchos números (2^32=4.294’967.296). Sin embargo las direcciones IP tienen una serie de reglas importantes, una arquitectura, por lo tanto no tenemos todos los números posibles para asignarlos como dirección de un nodo/host de la red. Luego veremos eso en gran detalle.
Las máscaras son iguales a las IPs: 32 bits escritos en notación decimal punteada, es decir, en decimal separada por puntos. La diferencia importante entre direcciones IP y máscaras es que las máscaras sólo tienen unos seguidos de ceros, por ejemplo: 255.255.255.0 son 24 unos seguidos de 8 ceros, de hecho, actualmente las máscaras se escriben en una notación diferente a la decimal punteada, se llama prefijo y se escribe con un / adelante, por ejemplo la máscara anterior se escribe /24 o la máscara 255.255.0.0 es igual a /16, dado que consiste en 16 unos seguidos de 16 ceros. Aunque en la práctica se usa mucho más la notación de prefijo, la mayoría de dispositivos sólo admiten máscaras en decimal y para completar, el examen hará muchas preguntas sobre máscaras en decimal y su relación con la notación de prefijo.
Ya hace varios años había escrito sobre éstos temas, si desean saber más les recomiendo mi publicación sobre conversión binaria fácil y mi tutorial de subnetting, sin embargo si apenas están aprendiendo continúen con ésta lectura.
Casos prácticos de uso de binario en direcciones IP
Ya en una publicación anterior hablé de la elección del primer salto, en ésta se debe determinar si la subred del destino es la misma del origen. Supongamos que un host de IP 172.16.16.16 con máscara 255.255.255.224 y gateway 172.16.16.29 desea comunicarse con un host de IP 172.16.16.10. Están en el mismo segmento? Lo que hace automáticamente la estación o host es aplicar la máscara bit a bit tanto a la ip origen como a la destino y si el resultado es igual entonces es el mismo segmento de red. Ambas comienzan con 172.16.16 y la máscara también tiene éstos tres octetos en 255 (todos los bits en 1), por ende ambas son iguales hasta el bit 24. La operación AND bit a bit es mirar si ambos bits están en 1:
172 = 10101100 255 = 11111111 AND -------- R/ 10101100 (=172)
Si se fijan, lo que ocurre es que donde los dos bits que se comparan son 1 el resultado es 1 y si alguno de los bits es cero el resultado es cero:
16 = 00010000 0 = 00000000 AND -------- R/ 00000000 (=0)
Los primeros 3 octetos son fáciles: el nro pasa tal como está. El último es truculento y es donde se ve que es necesario saber contar en binario. La máscara tiene el nro 224 en el último octeto, es decir, tiene los primeros 3 bits en 1:
Origen: 16 = 00010000 224 = 11100000 AND -------- R/ 00000000 (=0) Destino: 10 = 00001010 224 = 11100000 AND -------- R/ 00000000 (=0)
Como vemos el resultado es el mismo: 172.16.16.0. Todo lo que he escrito hasta ahora es ilustrar ejemplos básicos de cómo y cuándo usamos cálculos en binario, a continuación vamos a ver bien en qué se basa y cómo se hacen conversiones a diferentes bases numéricas como binario, decimal y hexadecimal.
Sistemas numéricos posicionales
Ahora sí entremos en materia, qué es un sistema de numeración posicional? Es es la forma en que contamos cosas, ni más ni menos. Tal vez de la escuela recordemos que cuando nos enseñaban a contar, nos mencionaban que, por ejemplo, el nro 246 en realidad era la suma de 200 + 40 + 6 o escrito de otra manera 2*100 + 4*10 + 6*1. Ya de adultos y con un poco más de habilidad con los números, podemos observar que lo anterior se puede escribir como 2*10^2 + 4*10^1 + 6*10^0, es decir, un nro (de 1 a 9) multiplicado por la potencia de 10 de su posición, empezando a contar desde cero (cualquier nro elevado a 0 es igual a 1). Ese es nuestro sistema de numeración decimal, cuya base es 10 porque se usan dígitos de 0 a 9, hay personas que dicen que tiene origen en nuestra tendencia a contar con los dedos de la mano.
Imagínense que existieran 16 dígitos, digamos que después del 9 el siguiente dígito lo llamamos A y al siguiente B y así sucesivamente hasta F, que vendría siendo el nro 15. Éste es el sistema de numeración hexadecimal, en el cual si escribimos el nro 10 en realidad significa 16, porque como es hexadecimal, cada posición es una potencia de 16, entonces sería 1*16^1 + 0*16^0. Es raro pero hay matemáticos que defienden que el sistema numérico de base 16 es mucho más eficiente que el decimal, sin embargo, rara vez lo usamos para contar. En computación y en particular en redes lo usamos mucho para representar más bits en menos espacio, por ejemplo, un octeto, es decir 8 bits, en decimal sería un nro de 0 a 255, pero en hexadecimal sería un nro de 00 a FF.
Y finalmente nuestra base digital: el binario. Como ya deben saber, binario significa que sólo se usan dos dígitos: 0 y 1, por ende la base es 2 y cada posición vale la potencia de 2 de su posición, por ejemplo, el nro 1011 es 1*8 + 0*4 + 1*2 + 1*1 ( 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0) = 8 + 0 + 2 + 1 = 11, el nro 1011 es igual al nro 11 en decimal. El binario, aunque en principio nos parece rarísimo y difícil hacer cálculos con él, es el sistema numérico más simple: no se puede tener un sistema numérico con menos dígitos! El nro que representa la cantidad mayor o la posición de más peso se llama bit más significativo (MSB por sus siglas en inglés): 100100, 0100, y los bits más a la derecha o de menor peso se llaman bits menos significativos: 100100, 0100
En ejercicios de conversión numérica, se acostumbra usar algún método para diferenciar la base de los números, es decir, cómo sé que 11 significa 17 porque la base era hexa o que significa 3 porque la base era 2? Yo uso una letra al final del nro para indicar la base, por ejemplo 11b = 3d, es decir el primer 11 está escrito en binario y el 3 en decimal. Así mismo si digo 11x = 17d porque 11 en hexadecimal es 17 en decimal. También se acostumbra usar la base misma, es decir 11base 2 = 3base10 o con un subíndice pero yo no sé cómo ponerlo en el blog :D.
Conversión de binario a decimal
Según las definiciones anteriores, si tenemos un nro en binario, convertirlo a decimal es supremamente fácil: sumo las potencias de 2 de las posiciones que tienen un 1. Antes de continuar vamos a hacer una observación importante: las potencias de dos son el doble de la anterior, entonces es supremamente fácil recordarlas. Las potencias de dos más notables para redes son hasta la posición 8 (es decir un octeto): 2^0=1, 2^1=2, 2^2=4, 2^3=8, 2^4=16, 2^5=32, 2^6=64, 2^7=128, que escrito en el orden correcto sería:
2^7=128, 2^6=64, 2^5=32, 2^4=16, 2^3=8, 2^2=4, 2^1=2, 2^0=1
o
128 64 32 16 8 4 2 1
Continuando, un nro en binario como 11000000 (éste es un típico tercer octeto de una máscara), se calcularía como 128 + 64 = 192. Ven? no es tan difícil. Éste tipo de cálculos deben ser familiares y fáciles para quienes deseen aprobar el examen de certificación 200-301 CCNA. Hay que practicar! (o aprenderselos de memoria: 128 = /25, 192 = /26, 224 = /27, 240 = /28, 248 = /29, 252 = /30, 254 = /31)
Conversión de decimal a binario
Para convertir un nro en decimal a binario se sugieren dos métodos, el más conocido y directo es la división sucesiva por 2, en la cual tomamos los residuos como los dígitos del nro en binario pero comenzando por el resultado de la última división (será el bit más significativo), es decir, leemos el resultado al revés. Por ejemplo, el nro 172, lo dividimos sucesivamente por 2:
172 / 2 = 86 (residuo 0)
86 / 2 = 43 (residuo 0)
43 / 2 = 21 (residuo 1)
21 / 2 = 10 (residuo 1)
10 / 2 = 5 (rediduo 0)
5 / 2 = 2 (residuo 1)
2 / 2 = 1 (residuo 0) **
172d = 10101100b
128 + 32 + 8 + 4 = 172
Noten, de nuevo, que el bits más significativo es el RESULTADO (no el residuo) de la última división. Este es un método clásico que en teoría es el más fácil, sin embargo, existe un método abreviado que a mí me parece más fácil, lo llamaremos resta sucesiva de potencias de dos. Es como ir construyendo el nro binario, restamos la potencia de dos más grande que quepa en el nro y si se puede restar activamos el bit correspondiente y continuamos con el residuo:
172 – 128 = 44 (10000000)
44 – 32 = 12 (10100000)
12 – 8 = 4 (10101000)
4 – 4 = 0 (10101100)
Como ven, hay menos operaciones, pero se necesita más familiaridad con las potencias de 2.
Conversión de binario a hexadecimal y viceversa
Finalmente, las conversiones entre Hexa y Binario son fáciles, dado que los dígitos hexadecimales equivalen a 4 bits y en cualquier caso, se hace una equivalencia entre cada 4 bits con su correspondiente en hexa decimal. Por ejemplo, si tenemos el nro 11000001 para escribirlo en hexadecimal tomamos cada 4 bits (empezando desde el menos significativo) y lo convertimos a hexadecimal 1100 = C, 0001 = 1, por ende 11000001 = C1
La tabla correspondiente sería así:
0000 = 0 0001 = 1 0010 = 2 0011 = 3 0100 = 4 0101 = 5 0110 = 6 0111 = 7 1000 = 8 1001 = 9 1010 = A 1011 = B 1100 = C 1101 = D 1110 = E 1111 = F
De hexa a binario también es trivial si nos sabemos la tabla anterior: 8A = 10001010b.
La conversión de decimal a hexa es más fácil convirtiendo a binario y de ahí a hexa, sin embargo se requiere mucha práctica con la conversión a binario. Por ejemplo 155 en hexa es 128 + 16 + 8 + 2 +1, es decir 10011011b y pasando a hexa sería 9D. La conversión de Hexa a decimal es igual que con los sistemas posicionales: sume las potencias. La ventaja es que en hexa casi nunca usamos nros de más de 2 dígitos o si lo hacemos no es necesario convertirlos a decimal, tampoco es usual que necesitemos convertir nros decimales a hexadecimal (excepto para uno o dos dígitos).
Existen varias observaciones que nos sirven para volvernos más ágiles haciendo conversiones, les recomiendo mi publicación de conversión binaria fácil que escribí hace algunos años cuando era docente, en la cual ilustro varias formas de abreviar los cálculos para convertir binario a decimal y viceversa.
Conclusiones y próximas publicaciones
Como ven, convertir números en diferentes bases es común en redes y en programación ni se diga. Recuerden que la tendencia es que las redes deben ser cada vez más programables, así que si les menciono alguna perspectiva de programación tómensela en serio porque en pocos años saber programar las redes va a ser mucho más importante que saber configurar los equipos (o será equivalente).
Entonces los sistemas binario y hexadecimal no son muy diferentes a nuestro sistema de numeración decimal, la conversión es fácil pero se necesita práctica y si quieren aprobar el examen de certificación deben ser ágiles en éstos cálculos para aprovechar el tiempo limitado del examen.
Las próximas publicaciones seguirán las temáticas de CCNAv7 en el grupo de temas de tecnología ethernet. Si les gustó el contenido por favor compartan y comenten.