Ir al contenido

PGD | §1.5 – Representación de magnitudes digitales

< §1.4 – El dominio analógico vs. el dominio digital

Si por ahora suponemos convertida una magnitud continua en una lista de posibles mensajes (magnitud digital), restaría entonces analizar cómo será identificado el mensaje particular entre las opciones disponibles.

En el ejemplo antes mencionado de las piezas de ajedrez, nuestro método de medición de información mediante preguntas Sí-No nos ha dado, paralelamente, un mecanismo de identificación: las propias respuestas ordenadas a las preguntas. Para verlo, volvamos al ejemplo de las piezas de ajedrez. Habíamos definido un esquema de 4 preguntas — ¿lado de la dama?, ¿fila superior?, ¿mitad derecha?, ¿mitad derecha?— que nos permitían ubicar una pieza. Con este sistema de preguntas, la pieza elegida en el ejemplo (caballo de dama) le correspondía la serie respuestas No-No-Sí-No. El lector podrá comprobar, análogamente, que la serie de respuestas correspondiente al peón de dama (la pieza superior izquierda) será Sí-Sí-No-No.

¿Es este sistema de preguntas único? Es fácil ver que no; la primera pregunta, por ejemplo, podría haberse formulado como ¿está la pieza elegida del lado del rey?, ya que su respuesta también permite descartar la mitad de las opciones incorrectas. Otra estrategia podría haber sido empezar con ¿es la pieza elegida un peón?

Debemos diferenciar entonces entre la cantidad de información contenida en un mensaje y el código o representación asignada al mismo, es decir, la serie de respuestas que lo identifican. Mientras que en este ejemplo la cantidad de información equivale a 4 bits, y por lo tanto necesitamos 4 preguntas, existe libertad para elegir cuáles serán esas preguntas, en la medida que se cumplan dos condiciones: 1) cada pregunta tendrá sólo dos respuestas posibles; 2) cada respuesta debe descartar la mitad de las posibilidades restantes. Cualquier sistema de 4 preguntas que cumpla con estas condiciones dará lugar a una tabla de correspondencia entre mensaje y código; en otras palabras, un sistema tal nos dará una posible codificación.

Estrategias de codificación en general

Está claro que el sistema anterior funciona, siempre que se sepan cuáles son las preguntas que deben ser formuladas. Presenta, sin embargo, un inconveniente: no es general, ya que está diseñado exclusivamente para identificar piezas de ajedrez. Ahora bien, si tuviera que comunicar simplemente la elección de un número entre 0 y 15, sabemos que también se requieren 4 preguntas (4 bits) ya que la variedad del conjunto de posibles elecciones es 16. Sería más útil construir una codificación basada solamente en el número del mensaje, para así prescindir de su naturaleza; de esta forma sería aplicable en cualquier caso que los mensajes o alternativas estén o puedan ser numeradas. Para ello pongamos los 16 números en una lista y asignemos un Sí ó 1 si el número elegido está en la mitad mayor, y No ó 0 si está en la mitad menor, repitiendo el proceso hasta eliminar la indeterminación.

Como ejemplo, veamos que código le corresponde al mensaje 9. Si dividimos los 16 mensajes en dos mitades 0-7 y 8-15, el 9 está en la mitad mayor (Sí = 1); dividimos esta mitad en dos partes 8-11 y 12-15 y el 9 cae en la mitad menor (No = 0); dividimos esa mitad en los dos grupos 8-9 y 10-11 y cae en el menor (No = 0); por último dividimos ese grupo en los dos mensajes que lo componen 8 y 9, encontrándose en la mitad superior (Sí = 1). Por lo tanto al 9 le corresponde la codificación Sí-No-No-Sí, equivalente a la secuencia de dígitos binarios 1001.

Repitamos este procedimiento con los 16 mensajes y ordenemos los resultados desde el mensaje 0 hasta el mensaje 15. Así resulta la siguiente codificación:

Número de mensaje elegidoPrimera respuestaSegunda respuestaTercera respuestaCuarta respuestaNúmero binario correspondiente
0NoNoNoNo0000
1NoNoNo0001
2NoNoNo0010
3NoNo0011
4NoNoNo0100
5NoNo0101
6NoNo0110
7No0111
8NoNoNo1000
9NoNo1001
10NoNo1010
11No1011
12NoNo1100
13No1101
14No1110
151111

Si eliminamos las columnas intermedias, tendremos una tabla que expresará una codificación de 4 bits para los números 0 a 15. La secuencia de dígitos binarios obtenida para cada mensaje se conoce como el número binario equivalente al número (decimal) de mensaje dado. Esta tabla podría extenderse: si agregamos una quinta pregunta (quinto bit) tendremos otros 16 mensajes posibles, totalizando 32 (25), mientras que un sexto bit nos permitiría manejar 64 (26) mensajes, etc.

Codificaciones digitales en el mundo real

Uno de los esquemas más conocidos de codificación en el dominio digital es la codificación del texto. A los efectos tanto de su transmisión como de su almacenamiento, se considera el texto como formado como una serie de caracteres: cada uno de ellos será nuestro mensaje. En otros términos, especificar un texto de una cierta extensión equivale a un primer mensaje para informar la primera letra, luego otro para la segunda letra, y así sucesivamente, cada una representada por un cierto código. Veamos diferentes codificaciones de uso práctico.

El código Morse

La invención del telégrafo en 1836, realizado por Samuel Morse, Joseph Henry y Alfred Vail, trajo aparejado la necesidad de establecer un mecanismo mediante el cual el novedoso sistema pudiera transmitir información. Inicialmente Morse pensó en anotar las palabras de uso más frecuente y crear con ellas un libro de códigos, asignando a cada una un número que sería el transmitido; un operador, al recibir ese número, buscaría en el libro la palabra correspondiente. Sin embargo, Vail extendió el código para asignar a cada letra y dígito su código particular, y en 1840 quedó establecido lo que se conocería como el código Morse americano estándar. El sistema se basa en transmitir pulsos cuya duración toma una de dos posibilidades (variedad 2), denominados puntos (•) para una duración breve y rayas (—) para una duración más larga, dando origen a uno de los usos más tempranos de los conceptos digitales, mucho antes de que existiera una teoría general sobre las comunicaciones. Cada carácter (letra, dígito o símbolo de puntuación) recibe en este sistema una serie única de puntos y rayas; si para cada carácter se utilizaran series de la misma longitud, cada símbolo recibido (punto o raya) correspondería exactamente a un bit de información.

Sin embargo, en una genial intuición, Vail comprendió que, para minimizar la serie de símbolos transmitidos, debía elegir secuencias de puntos y rayas más cortas para los caracteres de uso más frecuente, adelantándose un siglo a la moderna teoría de Claude Shannon antes mencionada. Por ejemplo, la letra e (al igual que en español, la letra de uso más frecuente) tiene por código un punto (•), mientas que la x (de uso relativamente poco frecuente) requiere la secuencia raya-punto-punto-raya (— • • —). Este concepto será útil cuando analicemos el proceso de compresión de la información digital.

El código ASCII 

En una primera aproximación consideraremos, por simplicidad, que las diferentes letras (o en general caracteres, para permitir la inclusión de otros símbolos como números, puntuación, etc.) no guardar relación unas con otras, y por lo tanto cada carácter del texto es una fuente de información independiente de los otros. En los comienzos de la computación esta idea se ensayó en los EE. UU. y dio lugar, después de cierta evolución, a una norma ANSI: el Código Americano Estándar para el Intercambio de Información, más conocido como ASCII por sus iniciales en inglés (American Standard Code for Information Interchange).

En el código ASCII, los distintos caracteres que pueden representarse son letras mayúsculas y minúsculas, números, símbolos de puntuación y otros de significado especial para ciertos dispositivos, conocidos como caracteres de control. En conjunto totalizan 128 caracteres; las páginas precedentes han preparado al lector para hallar fácilmente que, en estas condiciones, cada carácter contiene 7 bits de información. Esto significa que uno cualquiera de ellos tiene tanta información como el conjunto de posibles respuestas a 7 preguntas del tipo Sí-No. Dicho de otra forma, un carácter ASCII cualquiera equivale a una sucesión de 7 símbolos Sí-No.

El esquema de codificación empleado consiste en crear una lista ordenada con los 128 caracteres, asignarles a cada uno de ellos un número desde 0 a 127 y luego asociarles como código el número binario correspondiente. Claro que el orden en el que se coloquen esos 128 caracteres es arbitrario, pero por conveniencia se los dispone para que, por ejemplo, las letras ocupen lugares consecutivos y crecientes desde la a hasta la z —al igual que las mayúsculas A hasta Z y los dígitos 0 hasta 9— para que, por simple comparación numérica de sus respectivos códigos, un programa pueda ordenar alfabéticamente. A continuación se presenta una muestra de algunos caracteres y sus códigos ASCII correspondientes.

Número del símboloSímboloCódigo ASCII de 7 bits
0(carácter de control)0000000
1(carácter de control)0000001
2(carácter de control)0000010
(símbolos 3 a 46 omitidos)
47/0101111
4800110000
4910110001
(símbolos 50 a 56 omitidos)
5790111001
58:0111010
(símbolos 59 a 64 omitidos)
65A1000001
66B1000010
67C1000011
(símbolos 68 a 98 omitidos)
97a1100001
98b1100010
99c1100011
(símbolos 100 a 126 omitidos)
127(carácter de control)1111111

Este sencillo extracto muestra la forma que adopta la tabla; el lector encontrará aquí la tabla completa.

El código ASCII extendido

En la tabla anterior no se pone de manifiesto una desventaja de este código, que es la total ausencia de caracteres no presentes en el idioma inglés, como la ñ y las letras acentuadas. Para solucionar este inconveniente fue necesario extender la tabla ASCII, agregando un bit adicional, es decir utilizando códigos de 8 bits: esto lleva ahora a una tabla de 256 caracteres (28), que se denomina código ASCII extendido. Esta ampliación de 128 caracteres adicionales permitió incorporar no sólo letras con acento propias del español sino también los correspondientes de otros idiomas occidentales —acento grave, agudo, circunflejo, diéresis, tilde, etc.

El nuevo bit se agrega delante de los 7 bits originales. Este bit es 0 para los primeros 128 caracteres del código ASCII básico, y es 1 para los otros 128 caracteres que forman la extensión. Este esquema permite la compatibilidad entre los códigos, ya que para pasar de ASCII a ASCII extendido sólo es necesario anteponer un bit 0.

A pesar de esta mejora, existen dos grandes desventajas con este código:

  • No es estándar: diferentes sistemas han extendido la tabla ASCII básica con diferentes juegos de caracteres, y aún los mismos caracteres extendidos recibieron códigos diferentes[1].
  • Sólo sirve para los idiomas basados en el alfabeto latino; no hay posibilidad de codificar texto en idiomas no occidentales como el ruso, hebreo, o cualquiera de los idiomas orientales.

Estas limitaciones impulsaron el desarrollo de codificaciones alternativas que tuvieran un alcance más universal.

El código Unicode

Como hemos visto, 256 caracteres no son aún suficientes si pretendemos una codificación que abarque alfabetos más allá del latino; se impone entonces agregar bits adicionales. Por otro lado, si bien es técnicamente posible diseñar una nueva codificación desde cero —olvidándonos de cualquier otra codificación preexistente—es ventajoso que el nuevo sistema guarde alguna relación con otros aún en uso, como el ASCII, por razones de compatibilidad con la enorme base existente de programas, documentos y sistemas informáticos en operación.

Estas consideraciones llevaron al desarrollo del sistema de codificación Unicode —por Universal Code, código universal— donde en su concepción original se emplean 16 bits para identificar un carácter; esto significa que la variedad del conjunto Unicode es 216, es decir, 65.536 caracteres diferentes[2]. El precio a pagar por ello es, desde luego, que cada carácter requiere ahora 16 bits en lugar de 8, con lo cual un texto codificado en Unicode requiere el doble de almacenamiento que si estuviera en ASCII.

De todas formas, dado que una cantidad inmensa de documentación emplea mayoritariamente caracteres del alfabeto latino. para evitar esta duplicación de tamaño se han desarrollado variantes de Unicode que permiten emplear un byte para los caracteres en común con ASCII, y sólo agregan bytes adicionales cuando debe codificarse un carácter fuera de ese conjunto. La variante más usada es la UTF-8 (UCS Transform Format – 8 bit, donde UCS —Universal Character Set— es el juego de caracteres en el que está definido Unicode), que según estimaciones es la codificación empleada en más de la mitad de las páginas web existentes.

Actividades para el capítulo §1.5

  1. Fabrique una codificación personal simplificada de la siguiente forma. Escriba en columna las letras del alfabeto desde la A a la Z (sólo mayúsculas o minúsculas). Complete esa lista hasta que la variedad sea una potencia de dos, agregando el espacio y algunos símbolos de puntuación. A continuación asigne el primer bit 1 a los símbolos de la última mitad, y cero a los de la primera mitad. Agregue los bits siguientes dividiendo cada mitad a su vez en mitades, usando la misma estrategia (bit 1 para la última mitad, 0 para la primera) hasta que cada símbolo tenga su codificación. Finalmente, elija una palabra cualquiera y obtenga la serie de bits que le corresponden, codificando cada letra según la codificación hallada.
  2. La codificación anterior es fácilmente descifrable, ya que es posible deducir que a letras contiguas en el alfabeto le corresponden códigos contiguos. Favrique un nuevo código simplemente listando las letras y símbolos en un orden arbitrario, y obtenga el código resultante repitiendo el procedimiento. Vuelva a codificar la misma palabra. Observe y justifique qué es igual y qué es diferente en las series de bits así obtenidas.
§1.6 – Digitalización en general >

1 Esto explica el porqué del reemplazo de las letras acentuadas por caracteres extraños que tiene lugar cuando se intenta leer un archivo de texto escrito en otra plataforma (por ejemplo, al abrir en Windows un archivo escrito en Macintosh y viceversa); eso muestra que el texto original está codificado en ASCII extendido, que difiere entre plataformas. Esto no sucede si se codifica el texto en Unicode.
2 Para ser más precisos, este fue el propósito original de los creadores de Unicode, cuya intención era abarcar todos los idiomas escritos modernos sin considerar idiomas antiguos u obsoletos; esta codificación de 16 bits está limitada a esa función y se denomina ahora Plano Multilingüe Básico. El conjunto de todos los códigos de la versión actual de Unicode (10.0, Junio 2017) suman 1.114.112, aunque en la actualidad sólo un 10% de ellos son caracteres, ideogramas o grafías de alguna lengua escrita.