Regístrate | Conectar
El Tamiz Libros Recursos Series Únete 6 Users Online
Skip to content

Computador mágico XIII – Notación hexadecimal y octal




La serie “El computador mágico” está disponible también en forma de libro.

En los últimos capítulos de esta serie hemos estado viendo cómo representar números y texto en forma binaria. Hoy vamos a acabar este interludio más o menos teórico contando otras formas de representación que nos serán muy útiles. De nuevo, puede parecerte que estamos dando vueltas antes de llegar a lo que interesa… y en cierto modo es verdad, pero estamos sentando la base para que luego podamos ir directamente a lo interesante sin tener que pararnos para estos detallitos.

Como puedes ver en el título, ya no dice “representación”, sino “notación”. No sé si para ti esa distinción es importante, pero he querido llamarlo diferente para que te quede claro que las cosas siguen representándose internamente en el ordenador en forma binaria. El ordenador maneja 0s y 1s, nada más. Pero a menudo, cuando queremos mostrar ejemplos, cuando estamos hablando o cuando el ordenador muestra información por pantalla, resulta muy incómodo andar soltando esos chorros interminables de bits. Seguro que en alguno de los ejemplos de los últimos capítulos te ha ocurrido: aquello tenía tantos bits, tantos 0s y 1s, que ya no sabías si estabas mirando el 6º o el 7º bit.

Obviamente, convertir esos bits a decimal antes de mostrarlo es muy útil. Es decir, si el usuario debe leer en su pantalla que la temperatura es de 27 grados centígrados, no le mostraremos “00011011″, sino “27″. Pero a veces lo que estamos representando no es exactamente un número, y entonces traducirlo a decimal no solo es poco útil, sino que incluso es contraproducente.

Por eso se usan estas notaciones.

 

Notación octal

La primera de las notaciones que vamos a ver es una de las que menos se usan. Pero vamos a verla para ir introduciendo las cosas poco a poco.

Ya has visto que podemos representar un número en base 10 ó en base 2. Simplemente elegíamos los dígitos de ese número de modo que cada dígito representaba una potencia sucesiva de esa base. Entonces, por ejemplo, podemos inventarnos la base 8 (o base octal). Por ejemplo, podemos representar el número cuarentaidos en base 8:

52

¿Por qué 52? Porque:

cuarentaidos=5\cdot{}8^1+2\cdot{}8^0

Unos ejemplos más:

veintinueve: 35, porque veintinueve=3\cdot{}8^1+5\cdot{}8^0

cientoventitres: 173, porque cientoventitres=1\cdot{}8^2+2\cdot{}8^1+3\cdot{}8^0

No sé si te parecerá obvio, pero en base decimal cada dígito va de 0 a 9; en base binaria cada dígito va de 0 a 1; en base octal, de 0 a 7; en general, en base N los dígitos usados van de 0 a N-1. Si no fuera así es que en realidad tenía que haber puesto uno adicional (o más) en el dígito de la izquierda.

Pregunta: ¿cómo sé que el 52 está en base octal? Simplemente viendo el 52… yo no soy capaz de distinguir en qué base está. Ni yo ni nadie, vamos. A veces se debe sobreentender del contexto, como en nuestros párrafos anteriores, pero a menos que el contexto sea muy explícito, se usa alguna forma de identificarlos. A menudo se pone el número entre paréntesis o corchetes, y la base justo detrás, como por ejemplo (52)8 o [52]8. Más comúnmente se utilizan subíndices, como en 52_{8}. O incluso ambas a la vez, como en (52)_{8} ó [52]_{8}.

Estas notaciones son las más utilizadas por los matemáticos, porque son muy fáciles de generalizar a cualquier base. Por ejemplo, podemos decir:

52_{8}=42_{10}=60_{7}=1120_{3}=101010_{2}

Lo cual nos lleva a otra obviedad: podemos utilizar la base que queramos para escribir un número. Lo que ocurre, claro, es que algunas bases son más útiles que otras. La base binaria es muy útil porque es como lo representan los ordenadores, y de hecho es la primera de las bases enteras… parece que tiene cierta importancia intrínseca. La base 10 parece que es útil porque… ¡tenemos 10 dedos! Sí, no te rías, parece que a nadie se le ocurre otra explicación más convincente.[1]

Pero bueno, que me despisto. Esa notación con paréntesis o subíndices es útil para matemáticos, pero es un poco engorrosa de utilizar para los programadores, que no pueden escribir subíndices con facilidad en sus terminales de texto. Así que las siguientes notaciones son más utilizadas para indicar que el número está en octal.

Una forma muy utilizada es prefijar el número con una letra “o”. Por ejemplo: o52. La o podría confundirse con el número 0, y por eso a menudo se indica con una comilla, como en o’52. En ese caso a veces la letra O va en mayúsculas, como en O’52. Y a veces se pone detrás, como en 52o. Malo en todos los casos, porque de todos modos se puede confundir con el número 0.

En algunos entornos se asume que si un número empieza por el número 0, es un número octal. Por ejemplo: 052. Puede parecer una estupidez, dado que es fácilmente confundible con una base decimal en la que simplemente se han añadido ceros por la izquierda… pues sí… la verdad es que ha sido la fuente de algunos de los errores más impensables que he visto nunca… pero es lo que hay.

Finalmente algunos sistemas textuales permiten utilizar la barra inversa, como en \52.

Nosotros trataremos de usar la o minúscula, si es que lo necesitamos alguna vez (que creo que no, porque la base octal es la menos útil de las que vamos a ver).[2]

Notación hexadecimal

De las dos notaciones que vamos a ver en este capítulo, esta es la más usada (y por eso vamos a verla con más detalle). El concepto es el mismo, pero usando la base 16: cada una de las posiciones indica el multiplicador de la potencia de 16 correspondiente. Por ejemplo, si queremos representar el número treintaitres en hexadecimal, usamos:

21

¿Por qué 21? Porque:

treintaitres=2\cdot{}16^1+1\cdot{}16^0

Antes de ver más ejemplos, supongo que no te sorprenderá si te cuento que 21_{16}, (21)_{16}, [21]_{16}, h21, h’21, H’21, H21 y 21h son formas habituales de indicar que el número está en base hexadecimal. Pero a pesar de eso, creo que la forma más extendida de indicarlo es la que utiliza el lenguaje de programación C: prefijándolo con 0x. Por ejemplo, 0×21.

Veamos algunos ejemplos más:

treintaisiete: 0x25=2\cdot{}16^1+5\cdot{}16^0

cuatenraiuno: 0x29=2\cdot{}16^1+9\cdot{}16^0

cuarentaidos: 0x??=2\cdot{}16^1+10\cdot{}16^0. ¡Ostras! ¿Cómo escribo esto?

Si lo escribo 0×210, parecería que fuera 0x210=2\cdot{}16^2+1\cdot{}16^1+0\cdot{}16^0, que obviamente no es cuarentaidos sino quinientosventiocho… ¿qué hacemos?

Para buscarle solución solo debemos darnos cuenta de que el 8, el 3, el 5, etc… son solo dibujos. Convenciones. Todos sabemos que el 3 es el que viene detrás del 2, y este a su vez el que viene detrás del 1. Pero está claro que son solo garabatos, ¿verdad?

Así que lo que debemos hacer es inventarnos un garabato para representar el número que viene detrás del 9. Y el 10 no sirve, porque son dos dígitos. Tiene que ser un único dígito. Necesitamos un garabato nuevo. Mientras todos estemos de acuerdo en cuál es ese garabato, todo encajará.

Así que nos ponemos de acuerdo en que ese garabato sea el “A”. Fíjate en que he dicho “el A”, porque es un dígito, como “el siete”, “el ocho”, “el nueve”… “el A”. Obviamente nadie en su sano juicio dice “el A”, todo el mundo dice “la A”… prometo que dentro de un par de párrafos dejaré de hacerlo, pero durante unos minutos déjame ser pedante para recordarte que A es un garabato cualquiera. No es la letra “A”, es un garabato elegido arbitrariamente.. Así, se dice que:

A_{16}=10_{10}

Y entonces ya podemos representar el cuarentaidos en hexadecimal: 0x2A.

Pero claro… en cuanto intentemos representar el cuarentaitres tendremos el mismo problema. Bueno, pues para indicar “el que viene detrás del A” usaremos el garabato B:

cuarentaitres: 0x2B

En fin, no hace falta que siga, supongo que imaginas que después viene la C.[3] Y luego la D, y la E… ¿hasta cuando? Fácil. Si para la base 8 necesitábamos de 0 a 7, para la base 16 necesitaremos de 0 a 15… perdón, deberías estar hablando en hexadecimal: necesitaremos de 0 a F:[4]

0 = 0×0 = 0000

1 = 0×1 = 0001

2 = 0×2 = 0010

3 = 0×3 = 0011

4 = 0×4 = 0100

5 = 0×5 = 0101

6 = 0×6 = 0110

7 = 0×7 = 0111

8 = 0×8 = 1000

9 = 0×9 = 1001

10 = 0xA = 1010

11 = 0xB = 1011

12 = 0xC = 1100

13 = 0xD = 1101

14 = 0xE = 1110

15 = 0xF = 1111

Fíjate en que la costumbre dicta que los números en base decimal simplemente se escriben sin ningún tipo de indicación. Así, si en cualquier otro sitio que no sea este artículo me encuentro un 42, sé que está en base decimal. Y los números binarios… pues también. Si me encuentro 00101010, sé que está en base binaria. ¿Cómo lo sé? Por el contexto, simplemente. Es un número larguísimo, con un montón de 0s y 1s, pero ningún dígito es mayor que 1. Y estoy en un contexto de computadoras… Seguro que 00101010 está en binario. Obviamente, podría utilizar 00101010_2, pero solo se usa cuando es importante explicitarlo.

Así que ya podemos poner algunos ejemplos más:

cientoventitres: 0x7B

cuarentaiunmilcientodieciseis: 0xA09C

Incluso hay frikis que hacen chistes usando los dígitos hexadecimales:

4074=0xFEA

3735928559=0xDEADBEEF

¿Por qué es tan útil esta notación? Recordarás que decíamos que era muy habitual que los números y las letras los representáramos con 8 bits, con 16 bits, con 32 bits… Por ejemplo, podemos tener el número 42 representado en binario-con-8-bits: 00101010. Ahora lo escribimos también en notación hexadecimal: 0x2A. Fíjate ahora en qué cosa más curiosa: si tomo los primeros 4 bits de 00101010 y los codifico en hexadecimal, me sale un 2 (0010=0×2); si ahora tomo los 4 últimos y los codifico en hexadecimal, me sale una A (1010=0xA). ¡Qué curioso! ¡Los mismos que 0x2A!

No es casualidad: con 4 bits puedo representar 16 valores, que son justo los que permite un dígito hexadecimal. Así, si cualquier valor binario lo separo en grupos de 4 y voy convirtiendo cada uno de esos grupos a hexadecimal, todo encaja. Esta es la forma rápida de hacerlo, y es el motivo de que la notación hexadecimal se use tanto. Veamos un ejemplo:

41116
1010000010011100
1010 0000 1001 1100
   A    0    9    C
0xA09C
 

Podrías estar preguntándote si la notación octal cumple esa misma propiedad. Pues sí, la cumple, pero solo parcialmente: los bits pueden agruparse de 3 en 3 para barrer el rango de 0 a 7, que es justo lo que cubre cada dígito octal. El problema es que si utilizamos 8 bits o 16 bits, o cualquiera de los tamaños habituales, no podemos hacer grupos de 3 bis sin que nos queden huérfanos. Por eso la notación octal se usa menos.

Ah, por cierto, ¿recuerdas que en algún momento dijimos que los chorros largos de bits se solían separar en grupos de 4? Pues ahora ya ves que no es casualidad.

Esta notación hexadecimal se usa por todas partes: en la direcciones de memoria, en las direcciones IPv6, en las claves de cifrado… en realidad en cualquier sitio donde tengamos un chorro de bits que sea difícil de escribir en binario.

Antes de terminar, un desafío para que pienses: ya sabías sumar, restar, multiplicar y dividir en base 10. Te enseñaron en el colegio. En esta serie has aprendido a hacerlo en binario, y has descubierto que en realidad no hay tanta diferencia. ¿Serías capaz de hacerlo en base 16?

En el próximo artículo dejaremos el interludio teórico para ver más cacharritos que nos sigan llevando al ordenador.

 

 

  1. Esta explicación obvia el hecho de que con 10 dedos podríamos contar de 0 a 10, es decir, en base 11… pero bueno. []
  2. Ojo: he dicho la menos útil de las que vamos a ver, no he dicho que sea inútil. []
  3. ¿Ves? Ya he dejado de decir “el C”. Espero que este énfasis te ayude a verlo. []
  4. A veces se ponen en mayúsculas, otras en minúsculas. Da igual. []

Sobre el autor:

J ( )

 

{ 16 } Comentarios

  1. Gravatar maeghith | 03/03/2013 at 09:22 | Permalink

    Otro chiste friki que se hace es felicitar la navidad el 31-oct (=25 dec —en inglés—) :D

  2. Gravatar Matematicofisico | 04/03/2013 at 02:43 | Permalink

    Un artículo excelente J. Aunque a mi manera de ver, la notacion hexagesimal sólo es útil para nosotros, pues en realidad, los ordenadores son binarios :)

    PD. Hacer operaciones elementales en hexagesimal… Yo paso, la tabla de la multiplicación es enorme y me asusta mucho :D

  3. Gravatar J | 04/03/2013 at 01:16 | Permalink

    Hombre, multiplicación hexadecimal no, pero sumas hexadecimales… cuando trabajas con punteros y estás depurando acabas cogiéndole el tranquillo.

  4. Gravatar Argus | 06/03/2013 at 02:43 | Permalink

    Parece que la explicación de los dedos para contar en base 10 tiene algunos otros ejemplos que la apoyan, como es el caso de algunas regiones en África donde cuentan en base 5, o sea, como si contaran con una mano sólo. Quién sabe! El 8, por ejemplo sería 13, o sea, 1 mano y 3 dedos.

    Por cierto, que tuviéramos los dedos que tuviéramos siempre contaríamos en base 10: Si tuviéramos 8 dedos, diríamos 1, 2, 3, 4, 5, 6, 7 y 10. Y nuestra base “8″ se llamaría en realidad base 10 :-)

    Y ahora que lo pienso, el sistema de contar con dedos está basado en la numeración romana, es decir, que con una mano podemos contar como mucho hasta 5, y con las 2 como mucho hasta 10. Podríamos sacarle mucho más provecho si alargáramos o encogiéramos según qué dedos de la mano para representar 1s y 0s en binario. ¡Con una mano podríamos contar hasta 31, y con las dos hasta 1023!

  5. Gravatar Matematicofisico | 06/03/2013 at 08:09 | Permalink

    @Argus, buena idea, pero entonces todas las personas deberían saber el código binario de memoria para poder descifrar rápidamente el número que mostramos.

    PD. Me haz hecho reír con tu idea :D

  6. Gravatar J | 06/03/2013 at 10:19 | Permalink

    algunas regiones en África donde cuentan en base 5

    No lo conocía. Muy curioso.

    Lo de “1 mano 3 dedos” se usa en el baloncesto (aunque en ese caso la mano cerrada indica 10, solo significa 5 si está abierta).

    tuviéramos los dedos que tuviéramos siempre contaríamos en base 10

    Jeje. Cuidado con el chiste, que tú lo has entendido, pero a lo mejor confunde a otro lector. Siempre diríamos en base 10, pero siguiendo la misma nomenclatura que he usado en el artículo, base 10 sería base /ocho/, porque no tendríamos un garabato para el /ocho/ y tendríamos que usar el [10]/ocho/… pero como sería el más habitual para nosotros, por tener solo /ocho/ dedos (como Homer Simpson), diríamos simplemente base 10.

    con las dos hasta 1023

    Cuando tienes soltura con esto, enseguida te acostumbras a que cada 10 bits son 1024 (técnicamente 1Ki, 1 Kibi-loquesea). O redondeado a 1000… 1k. Así que con 32 bits tienes para (32=30+2… con los 30 consigo 1k…1m…1g… y con los 2 que quedan consigo un 4…) 4Gi.

  7. Gravatar Argus | 06/03/2013 at 11:35 | Permalink

    matematicofisico, no sería muy práctico recordar 1023 posiciones, pero sí podríamos al menos usar el truco para expresar con una mano los números hasta el 31. Por ejemplo, con la mano derecha palma hacia abajo, hacemos que el valor del pulgar sea 1 y el valor del meňique 16. De esta forma, seguro que el 4 y el 18 son fáciles de recordar :-D

  8. Gravatar Argus | 07/03/2013 at 09:34 | Permalink

    Estoy intentando las multiplicaciones en hexacedimal y la cosa tiene miga. Para empezar hay que aprenderse las tablas casi desde cero, como en el colegio. En aquel entonces nuestras tiernas mentes adquirieron cierta soltura en apenas un año. Ahora la tarea se pone muy cuesta arriba! Para muestra la sencillísima tabla del 2:

    2, 4, 6, 8, A, C, E, 10, 12, 14, 16, 18, 1A, 1C, 1E

    Con esto vemos que A, C y E son pares. Es raro. Cuesta asimilar que son pares, como cuando nos decían en el colegio los números pares por primera vez y sonaba eso a chino.

    O la tabla del 5, que tiene 3 terminaciones en lugar de 2:

    5, A, F, 15, 1A, 1F, ….

    Y la tabla del 8, que es en este caso la que tiene sólo 2 terminaciones:

    8, 10, 18, 20, 28, …

    Muy curioso todo.

    Ahora a escribirlas 100 veces y aprenderse de la 1 a la 5 esta semana, de la 6 a la A la semana que viene y de la B a la F dentro de 2 semanas. Luego examen. ¡Qué recuerdos! :-D

  9. Gravatar J | 07/03/2013 at 10:08 | Permalink

    Argus,

    argumentum ad wikipedium: tu tabla del cinco está mal: http://es.wikipedia.org/wiki/Sistema_hexadecimal . Tienes la tabla de multiplicar a la derecha del artículo.

  10. Gravatar AntonioE. | 07/03/2013 at 10:32 | Permalink

    Yo abogo por la base 12, http://es.wikipedia.org/wiki/Sistema_duodecimal Podemos contar hasta doce con cada mano, contando las falanges de los dedos no pulgares. Sería util también para ordenadores trinarios.

    ¡Viva la docena! :D

  11. Gravatar Argus | 07/03/2013 at 10:50 | Permalink

    Ops! sí, me colé con la del 5. He hecho la tabla en excel y llevo un rato dándole vueltas en plan matrix jeje. Se ven ciertas curiosidades. Qué interesante esto de volver a estudiar símbolos y tablas de multiplicar antes de tenerlos interiorizados. Me veo igual de perdido que estaba en el colegio y con la misma sensación de entonces: “Esto es imposible aprendérseloooo!”

  12. Gravatar Argus | 07/03/2013 at 01:45 | Permalink

    AntonioE., ¿cómo funcionaría un ordenador trinario? ¿con dos niveles de potencial o algo así?

  13. Gravatar AntonioE. | 11/03/2013 at 02:20 | Permalink

    Así como imagino cada bit como un botón que puede estar conectado(1) o desconectado(0), imagino cada trit como una palanquita que puede estar hacia arriba(+1), hacia abajo(-1) o en el medio(0). http://proinf.net/permalink/sistema_de_numeracion_ternario PD: Puede que la base 12 no sea tan útil para ordenadores trinarios, ya que el enlace no la menciona, mientras referencia la base 9 y la base 27.

  14. Gravatar Alb. | 18/03/2013 at 11:41 | Permalink

    Los ordenadores ternario no son mera especulación, sino que se fabricaron comercialmente y durante un tiempo compitieron con los de logica binaria.

    http://www.microsiervos.com/archivo/ordenadores/setun-ordenador-ruso-logica-ternaria.html

    “Propuesto por Nikolay Brusentsov en Universidad Estatal de Moscú en 1956, estaba basado en la idea de que los núcleos de ferrita se adaptaban mejor al uso de una lógica ternaria en el ordenador que el de una lógica binaria, que desaprovechaba uno de los estados posible de estos núcleos.”

    En el siguiente articulo se explica con detalle como funcionan las memorias binarias de nucleos de ferrita. No se cual es el tercer estado del núcleo que se desaprovecha.

    Quizás utilice el núcleo magnetizado en un sentido , en sentido contrario y sin magnetizar.

  15. Gravatar Alb. | 18/03/2013 at 11:42 | Permalink

    Se me olvidaba el link: http://www.teknoplof.com/2009/11/25/memorias-de-nucleos-de-ferrita/

  16. Gravatar Macluskey | 18/03/2013 at 02:23 | Permalink

    @Alb: Yo sí que estudié las ferritas hace centurias, puesto que las memorias de los ordenadores de entonces estaban formadas de ferritas, las conozco razonablemente bien y no se me ocurre cómo se podía “meter” un tercer estado. O estaban magnetizadas en un sentido o en otro; una vez magnetizadas, no veo cómo “desmagnetizarlas” de forma rápida y eficaz.

    Claro que yo sé lo que enseñaban a los informáticos del tiempo del cuplé, no a los físicos, así que igual había una manera…

    Cuando J llegue a explicar cómo funciona la memoria, en unos capítulos más, seguramente meteré las narices en su serie para explicar cómo era esa maravilla de la ciencia y la ingeniería que eran las ferritas de ordenador… ;)

    Saludos

Escribe un comentario

Tu dirección de correo no es mostrada. Los campos requeridos están marcados *

Al escribir un comentario aquí nos otorgas el permiso irrevocable de reproducir tus palabras y tu nombre/sitio web como atribución.