Está en la página 1de 19

5

CODIFICACIN DE LA INFORMACIN
5.1. Concepto de cdigo Para que un ordenador pueda manejar determinada informacin hay que codificarla en binario, es decir, encontrar una aplicacin al menos inyectiva (pero normalmente biyectiva): f: A Bn entre el conjunto A de objetos a codificar y el conjunto Bn = BB...B (n veces), siendo B={0,1}. Esto permite codificar los objetos de A mediante nmeros de n bits: el objeto a se representa en el ordenador por el nmero binario f(a) y como la aplicacin es inyectiva a objetos distintos le corresponden codificaciones distintas. Como la unidad realmente empleada es el byte, el nmero n casi siempre es mltiplo de 8. Hay que notar que la memoria del ordenador es finita, por tanto lo primero que se debe hacer normalmente es hacer finito el nmero de objetos de A. En los apartados sucesivos vamos a ver como se pueden codificar diverso tipo de objetos.

5.2. Codificacin de los nmeros enteros Vamos a empezar por los nmeros enteros, el conjunto Z de los nmeros enteros es infinito, luego no se puede representar, por ello lo primero que se debe realizar es seleccionar un subconjunto de Z suficientemente grande para que contenga todos los nmeros que vayamos a necesitar en el problema que estemos tratando. Si utilizamos un byte podremos representar 28= 256 nmeros, si utilizamos 2 bytes, 216 = 65536, con 4 bytes, 232 = 4394967296, etc.

82

TEMA 5 Codificacin de la informacin

La finitud del rango empleado hace que los resultados de las operaciones no siempre queden dentro del rango (sumando de uno en uno alguna vez tenemos que salirnos del rango), en esos casos el procesador debe avisar al programador de que el resultado es incorrecto, para que pueda tomar las medidas oportunas. Eso fue explicado en el tema dedicado al procesador y no insistiremos sobre ello aqu. Si el problema no necesita emplear nmeros negativos la codificacin ms elemental es escribir directamente el nmero en base 2, es lo que se llaman nmeros sin signo o binario puro, por ejemplo la codificacin de 1234 con 16 bits sin signo sera 0000010011010010. Si necesitamos emplear nmeros negativos hay diversas representaciones posibles, la ms sencilla es reservar un bit para el signo y el resto para el valor absoluto del nmero, es lo que se llama nmero con signo y magnitud. El signo se suele poner en el bit ms significativo y se suele emplear 0 para nmeros positivos y 1 para negativos. Segn eso la codificacin de 1234 con 16 bits con signo y magnitud sera 0000010011010010, y la de -1234 sera 1000010011010010, ntese que este nmero interpretado como nmero sin signo sera 34002, por eso hay que distinguir muy bien un nmero de su codificacin, hay objetos de tipo distinto que se codifican igual. La codificacin de nmeros enteros por signo y magnitud presenta diversos inconvenientes: el primero es que el 0 tiene 2 representaciones, uno como +0 y otro como -0 y, el segundo, es la dificultad para realizar las operaciones con nmeros negativos, especialmente sumas y restas. Como los nmeros se almacenan en un ordenador para operar con ellos, no es muy utilizado. Otra posible forma de codificar los nmeros con signo es la notacin en complemento a 1. En este caso los positivos se representan en binario puro pero con un bit menos y para los negativos se hace el complemento a 1 de todas las cifras del valor absoluto; como los positivos emplean un bit de menos, el bit superior de todos los positivos es 0 y el de todos los negativos es 1. En esta notacin la representacin de 1234 con 16 bits es 0000010011010010 y la de -1234 es 1111101100101101, complemento a 1 del anterior. Esta notacin presenta tambin algunos inconvenientes: el cero sigue teniendo dos representaciones 00...00 y 11...11 y las operaciones de suma y resta son ms sencillas que en el caso anterior, pero necesitan tambin ser especiales, no valen las de enteros sin signo. Finalmente, el mtodo ms empleado para codificar enteros con signo es el de complemento a 2, que codifica los positivos en binario puro y los negativos, como el positivo que se obtiene al sumarles 2n siendo n el nmero de bits que se emplea en la representacin, esto es equivalente a sumar 1 al complemento a 1 del nmero. Por ejemplo 1234 con 16 bits es como siempre 0000010011010010, y -1234 es 1111101100101110, la suma de ambos (considerados como nmeros en binario puro) es 10000000000000000, pero como estamos haciendo los clculos con 16 bits el bit del principio se debe suprimir y queda 0000000000000000 es decir 0. Esta es la mayor ventaja de la notacin en complemento a 2, permite emplear la misma operacin de sumar que para nmeros sin signo. Con esta notacin el cero ya tiene representacin nica es slo 00...00. Los positivos empiezan por 0 y los negativos por 1, el mayor nmero representable con n bits es 2n-1-1 y el menor es -2n-1. Para sumar y restar se puede emplear la misma operacin que para los nmeros sin signo, pero la multiplicacin y divisin necesitan ser especiales. 83

Apuntes de Informtica

5.3. Codificacin de los nmeros reales Pasemos ahora a los nmeros reales R, tambin son infinitos, incluso los reales entre 0 y 1 son infinitos, ms an, un nmero como , como tiene infinitos decimales que no se repiten peridicamente (no es racional), es imposible codificarlo, sin embargo para aplicaciones prcticas puede ser suficiente con 3.1416 o 355/113, dependiendo de la precisin necesaria en el resultado final. La segunda de las representaciones es fcil de hacer, se aproxima cada nmero real por un racional y se escriben su numerador y denominador como una pareja de enteros, que ya sabemos representar, este enfoque tiene un pequeo inconveniente, al operar con racionales el numerador y el denominador crecen excesivamente, pudiendo desbordar fcilmente el rango con el que codifiquemos los enteros, necesitamos pues otra representacin. La primera representacin de si puede no obstante emplearse, pero como siempre en base 2, es decir se pone un nmero de n bits de los cuales los r primeros son la parte entera y los s ltimos la parte decimal (en base 2). Para sumar y restar no existe el mayor problema, las operaciones son idnticas a las realizadas con enteros; para la multiplicacin y la divisin las operaciones se realizan con enteros, cuidando de colocar la coma al final en el sitio oportuno (exactamente igual que lo que se hace cuando se opera en decimal). Esta notacin recibe el nombre de representacin en coma fija y el mayor inconveniente que presenta es que se puede desbordar fcilmente el rango asignado a la parte entera, por ello lo que ms se utiliza es la notacin en coma flotante que se explica a continuacin. Para poder manejar nmeros grandes se emplea la notacin cientfica que consiste en poner el nmero como A 10 B con 1 A < 10 y B Z, la parte A recibe el nombre de mantisa y la parte B se llama exponente. El ordenador emplea este mismo tipo de representacin, pero cambiando 10 por 2 y tomando un nmero fijo de bits para codificar la mantisa y el exponente, por ejemplo el nmero 3.1416 en binario es 11.0010010000111111111001... (ntese que por el mero hecho de pasar el nmero a binario estamos perdiendo precisin, un nmero que se puede representar exactamente en decimal puede requerir infinitos decimales para representarse en binario). Es decir, en notacin cientfica y en binario sera 1.10010010000111111111001... 21. Por tanto, si decidimos codificar la mantisa con 24 bits y el exponente con 8, podramos representarlo por la pareja de enteros 110010010000111111111001 y 00000001. Para el problema de los signos hay diversas soluciones posibles, para el signo del exponente se suele aadir una constante llamada exceso de modo que se eviten los nmeros negativos, si por ejemplo esa constante fuera 127, el exponente quedara codificado en el caso anterior como 128 = 100000002. El signo de la mantisa se puede colocar en un bit, ponindolo a 0 para los positivos y a 1 para los negativos. Adems como el bit ms significativo de la mantisa es siempre 1 (salvo para el 0, que se representa habitualmente poniendo como exponente con exceso 0) se suprime. Con eso el nmero anterior quedara codificado si ponemos primero el signo, despus el exponente y finalmente la mantisa (suprimiendo el bit ms significativo) como: 0 10000000 10010010000111111111001 Lo que hemos explicado hasta ahora es como codifican los procesadores de la familia 80x86 de Intel los nmeros en simple precisin, lo que equivale aproximadamente a 7 decimales y llega hasta 10 38.

84

TEMA 5 Codificacin de la informacin

Si se necesita ms precisin existe un formato de doble precisin, que es como el anterior, pero con 53 bits para la mantisa y 11 bits para el exponente, eso equivale aproximadamente a casi 16 decimales y llega hasta 10 308. Existe adems un formato llamado temporal que emplea 64 bits para la mantisa y 15 bits para el exponente obteniendo aproximadamente 19 decimales y llega hasta 10 4932, en ste ltimo caso no se suprime el bit ms significativo de la mantisa. La representacin del nmero anterior como doble y temporal queda pues: 0 10000000000 10010010000111111111001... 0 100000000000000 110010010000111111111001... Todo lo anterior se resume en la siguiente tabla: Bits Bits Mantisa exponente Simple 24 8 Doble 53 11 Temporal 64 15 Tipo Total bits 32 64 80 Exceso 127 1023 16383 Decimales aprox. 7 16 19 pot. de 10 aprox. 38 308 4932

Para determinadas aplicaciones es imprescindible no cometer errores de redondeo en la representacin de los nmeros, y al pasar de decimal a binario se puede perder precisin. Por ejemplo, el nmero 0.1 10 escrito en binario es 0.0001100110011001100110011...2, al tener que representarlo en base 2 nos vemos obligados a perder precisin. La solucin es representarlo en notacin en coma fija y en decimal. Dado que los dgitos del 0 al 9 se pueden representar con un nmero de 4 bits, se emplean cuatro bits para representarlos, esta notacin recibe el nombre de BCD, es decir, Decimal Codificado en Binario. Por ejemplo, el nmero 1234.56 escrito en notacin BCD empleando 4 dgitos BCD (es decir 2 bytes) para la parte entera y dos para la parte decimal quedara: 0001 0010 0011 0100.0101 0110BCD.

5.4. Cdigos alfanumricos Adems de tratar nmeros la aplicacin ms comn de los ordenadores es tratar informacin de tipo alfanumrico, es decir textos. Un texto puede contener nmeros, pero que no se utilizan como tales. Por ejemplo, una direccin contiene el cdigo postal, pero los cdigos postales no se suman, en otras palabras podra estar formado por letras en lugar de nmeros. Las letras del alfabeto son 26, si contamos las maysculas salen 52, si aadimos los signos representativos de los nmeros (del 0 al 9) pasamos a 62 y aadiendo signos para la coma, punto y coma, etc. se pasa de 64, por tanto debemos emplear al menos 7 bits a emplear para codificar las letras del alfabeto. Es decir, necesitamos una aplicacin inyectiva: f: L B7

siendo L el conjunto de las letras antes mencionadas, es decir: L = {a, b, ..., z, A, ..., Z, 0,..., 9, , , ;, ... } 85

Apuntes de Informtica

Si cada ordenador empleara una aplicacin f distinta sera muy difcil compartir la informacin entre ellos, por ello es necesaria la utilizacin de cdigos estndar. El primero de esos cdigos es el EBCDIC, actualmente en desuso. El que utilizan la mayora de los ordenadores actuales es el denominado ASCII (American Standard Code for Information Interchange ), como su propio nombre indica, est pensado para los angloparlantes, con lo cual no contiene la letra '', acentos, etc., por ello, y aprovechando que los ordenadores trabajan con bloques de 8 bits, se emplean cdigos de 8 bits que s contienen ya las letras exclusivas de otros idiomas como el espaol. Por desgracia esas extensiones del cdigo ASCII no son estndar, es decir, el cdigo por ejemplo de la letra '' no es siempre el mismo, con lo cual, al pasar un texto que la contenga de un ordenador a otro puede salir en su lugar cualquier otro smbolo. Para evitar eso existe un estndar posterior al cdigo ASCII, llamado ANSI (siglas de American National Standar Institute , creadores del mismo), que s es de 8 bits y define dnde debe quedar la letra '', ese es el cdigo que se empleaba por ejemplo el entorno Windows 3.x de Microsoft, pero dado que no es de uso universal (el propio MSDOS que se carga antes que el Windows emplea otro distinto) no soluciona el problema. Actualmente las versiones modernas de Windows utilizan tambin un cdigo de 16 bits (lo que da para 65536 letras) llamado UNICODE, los 256 primeros caracteres del UNICODE coinciden con los del ANSI y en los superiores al 256 contiene caracteres ms exticos, como los del chino, etc.

5.5. Codificacin de sonidos en el ordenador El sonido es una onda, por tanto lo podemos representar matemticamente por una aplicacin f: [a,b] R siendo [a,b] el intervalo del tiempo en el que estemos considerando el sonido y f(t) la amplitud de la onda correspondiente en el instante t. Para introducir una funcin en el ordenador es suficiente dar una ecuacin que permita calcular la misma, pero esto, en el caso del sonido no es posible debido al espacio limitado de memoria. Por tanto hay que conformarse con una representacin aproximada, pero lo suficientemente prxima al sonido real que no pueda distinguirla el odo humano. Lo que se hace es muestrear el sonido, es decir, dividir el eje del tiempo en partes iguales y observar el valor de f(t) slo para esos valores. De esta manera reducimos el sonido a una sucesin de nmeros reales {f(t 0), f(t 0+h), f(t 0+2h), ...}, pero como los nmeros reales no podemos representarlos de modo exacto en el ordenador, deberemos reducirlos primero a enteros. Si la amplitud mxima de la onda es, por ejemplo, 1, podemos multiplicar por 127 y redondear a entero, trasformando la sucesin en una de enteros entre -127 y 127, que se pueden representar con 1 byte para cada entero; si se quiere ms precisin se puede multiplicar por 32767 y representarlo como 2 bytes.

86

TEMA 5 Codificacin de la informacin

El odo humano es capaz de escuchar las frecuencias que hay entre 20 Hz y 20000 Hz. Segn el teorema de Nyquist para poder recuperar las frecuencias hasta 20000 Hz hace falta muestrear con el doble de frecuencia, es decir 40000 Hz. El ejemplo ms conocido de msica en forma digital son los discos compactos, ms conocidos como CD, en ellos se toma como frecuencia de muestreo 44100 Hz. Las muestras son de 16 bits y se tienen dos canales (estreo), segn lo cual hacen falta 4410022 = 176400 bytes, aproximadamente 172 Kb, para representar un segundo de sonido. Eso es algo ms de 10 Mb por minuto y ms de 600 Mb en una hora que puede contener un CD de audio. Naturalmente si se precisa menos calidad se puede reducir la frecuencia de muestreo, el nmero de bits o el nmero de canales. Por ejemplo, la voz humana queda perfectamente representada con una frecuencia de muestreo de 11025 Hz, ya que las frecuencias predominantes de la misma no pasan de 4000 Hz. El principal inconveniente de esta representacin del sonido es que ocupa mucho espacio. Un minuto de sonido en calidad CD ocupa algo ms de 10 Mb. Por ello, si lo que se quiere representar es exclusivamente msica, se puede recurrir a mtodos que requieren menos m emoria. La msica se puede representar mediante una partitura, en ella se pueden encontrar una serie de notas, cada una con una duracin y tocadas en diversos momentos con diversos instrumentos. Esto se puede reducir fcilmente a forma digital, es suficiente darle un nmero a cada nota, un nmero a cada instrumento y representar de alguna forma en que instante del tiempo tiene lugar cada una. La forma ms fcil de hacer eso es dividir el eje del tiempo en partes iguales (en este caso de 1/100 segundos o algo similar) y con un nmero de, por ejemplo, 16 bits indicar el evento que ocurre en ese instante, es decir: nota que suena, instrumento, etc. Para permitir que varios instrumentos puedan tocar diversas notas en un mismo instante se deben tener varias pistas, cada una con informacin de tipo similar. Con este sistema 1 segundo de sonido con cuatro pistas (correspondientes cada una a un instrumento) ocupa 10024 = 800 bytes, una cantidad ridcula comparada con lo que ocupa un segundo de sonido digital con calidad CD. Para recuperar el sonido original, a partir de la representacin anterior, se necesitara tener digitalizadas previamente todas las notas de todos los instrumentos que se vayan a emplear. Normalmente se suele poner slo una nota por instrumento y obtener el resto variando la frecuencia de reproduccin de dicha nota: por ejemplo, si se tiene la nota DO de una octava muestreada a 44.1 KHz y se quiere obtener la de la octava superior, que tiene el doble de frecuencia, es suficiente reproducir una muestra s y otra no de la original a 44.1 KHz para obtener el sonido deseado, y si la que se necesita es la de una inferior, se interpola un nmero entre cada dos muestras de la original. Para otras notas distintas el proceso es similar, pero algo ms complicado. Para hacer que suenen los diversos instrumentos es suficiente sumar las ondas correspondientes antes de reproducirlas.

5.6. Codificacin de imgenes en el ordenador Una imagen se puede considerar una aplicacin: f: [a,b] [c,d] C 87

Apuntes de Informtica

siendo f(x,y) el color del punto de coordenadas (x,y) de la imagen. Como en el caso del sonido nos vemos obligados a cambiar [a,b] y [c,d] por conjuntos finitos de puntos para poder representar la imagen en el ordenador. Supondremos, en lo que sigue, que [a,b] lo dividimos en 640 partes y [c,d] en 480. De nuevo, como en el caso del sonido, si queremos ms calidad, tenemos que aumentar dichos nmeros. Con ello tambin aumentara el espacio necesario para almacenar la imagen, pero en este caso, de forma cuadrtica, es decir, si duplicamos los puntos en cada eje, la imagen ocupa cuatro veces ms. Cada uno de los puntos (x,y) en los que almacenamos la imagen recibe el nombre de pixel. Nos queda por averiguar como representar el color. Hay diversas posibilidades, pero la ms empleada es el sistema RGB, que consiste en poner la intensidad necesaria de Rojo (Red), Verde (Green) y Azul (Blue) que mezclados producen el color deseado: Amarillo: es la mezcla a partes iguales de Rojo y Verde Naranja: se obtiene mezclando a partes iguales Rojo y Amarillo, es decir, mezclando el doble de Rojo que de Verde y nada de Azul Blanco: se obtiene por la mezcla a partes iguales de los tres colores. Si para cada color empleamos un nmero de 8 bits, tendremos en total 24 bits por pixel lo que proporciona 224 = 16777216 colores. Si volvemos a la imagen de partida de 640480 pixels necesitaremos para codificarla 6404803 = 921600 bytes, es decir 900 Kb, espacio que equivale aproximadamente al de 5 segundos de sonido con calidad CD. Para representar la imagen se pone primero los colores de los pixels de la primera lnea, de izquierda a derecha, despus los de la segunda y as hasta la ltima. Dado el espacio que ocupan las imgenes, es necesario, como en el caso del sonido, encontrar alguna manera de reducirlo. Lo ms elemental es reducir el nmero de pixels, tambin se puede reducir el nmero de bits por color, por ejemplo a 5 (es decir a 15 bits por pixel), pero con dichos mtodos se pierde calidad en la imagen, veamos otra forma mejor. Supongamos que la imagen que queremos codificar es un dibujo hecho por nosotros. Como es natural, no tenemos 16777216 pinturas, sino tan slo 10 15, de modo que cada uno de esos pixel ser uno de los colores de las pinturas que tenemos. En lugar de representar cada color por tres bytes correspondientes a sus componentes roja, verde y azul, es mejor numerar las pinturas: la 0 es negra, la 1 azul, la 2 blanca, etc. y representar cada pixel por el color de la pintura con la que lo hemos dibujado. En ese caso si partimos de que tenemos 16 pinturas, podemos codificar cada una con 4 bits y la imagen ocupar 6404804 = 1228800 bits, es decir 150 Kb, la sexta parte que si la hubisemos codificado directamente con los colores de los pixels. Adems tendremos que almacenar una tabla, llamada paleta, con la equivalencia de cada color de los nuestros en el sistema RGB, por ejemplo el negro es (0,0,0), el azul es (0,0,255), etc. Pero esta tabla ocupa tan slo 163 = 48 bytes, cantidad muy inferior a lo ocupado por la imagen.

88

TEMA 5 Codificacin de la informacin

La imagen, como en el caso anterior, se codifica de izquierda a derecha y de arriba a abajo. Previamente a la imagen hay que poner la paleta y indicar cuantos colores tiene. En el ejemplo anterior hemos supuesto que la imagen estaba hecha por nosotros y tena un nmero pequeo de colores, qu pasa si partimos de una imagen real? En ese caso no se puede conseguir codificar con 16 colores, pero en lugar de necesitar 16777216, puede que slo tenga 1000 o 2000 distintos y se podra codificar con una paleta de, por ejemplo, 12 bits, lo que tambin supone un ahorro. En la prctica no se emplean paletas de ms de 8 bits. Esto significa que deberamos, previamente, reducir a un mximo de 256 colores, cambiando algunos, por otros parecidos que si figuren en la paleta. Con esta reduccin se distorsiona algo la imagen, pero en la prctica no suele diferir mucho de la original, y ocupa la tercera parte que sta.

5.7. Codificacin de videos en el ordenador Un vdeo se compone de una secuencia de imgenes y de sonido. Para que el cerebro no perciba el salto entre las imgenes es suficiente con emplear 15 fotogramas por segundo; si consideramos fotogramas de 640480 codificados con 24 bits, un segundo de vdeo consume ms de 13 Mb, al que, adems, hemos de aadir el sonido, con lo que se debe aumentar algo esa cantidad. Eso presenta dos problemas: Cantidad elevada de espacio de almacenamiento Y la velocidad de transferencia por ello los videos se deben forzosamente almacenar comprimidos. Hay bsicamente dos tipos de compresin: Compresin sin prdida de calidad: Permite recuperar el original tal cual era y, suele conseguir, (dependiendo del tipo de datos), reducir el tamao de almacenamiento a la mitad, que an no soluciona el primer problema. Con prdida de calidad En este caso, al descomprimir los datos, obtenemos algo distinto al original. Dependiendo del grado de compresin que consigamos, el parecido con el original ser mayor o menor. Normalmente se puede lograr un compromiso entre ambos factores (prdida de calidad y grado de comprensin) de modo que se pueda almacenar en un CDROM (es decir en 650 Mb) una hora de vdeo con una calidad aceptable.

5.8. Mtodos de compresin de la informacin Como hemos visto en el apartado anterior se precisa tener mtodos para que la informacin ocupe el mnimo espacio posible. En este apartado nos vamos a ocupar exclusivamente de mtodos que no pierdan calidad. 89

Apuntes de Informtica

Volvamos a la imagen que pintamos con una paleta 16 colores en el apartado 5.6, est claro que debe haber amplias zonas de la imagen que tienen el mismo color, ya que slo tenemos 16 colores y 307200 pixel. Supongamos que en la primera lnea los 10 primeros pixels son del mismo color, por ejemplo azul, entonces la codificacin de la imagen empezar as: 0001, 0001, 0001, 0001, 0001, 0001, 0001, 0001, 0001, 0001, ... es fcil reducir esos bits a algo ms comprimido, es suficiente con decir: repetir 10 veces el valor 0001; cmo se puede codificar eso?, pues por ejemplo: 00001010 0001, el primer nmero indica el nmero de veces que se ha de repetir un color (con 8 bits) y el segundo el color que se repite. Para codificar los colores que no se repiten se puede emplear, por ejemplo, un nmero de 8 bits con el superior puesto a 1 y, el resto, la cantidad de colores que no se repiten (o que al codificarlos como repetidos perderamos espacio), por ejemplo si la imagen anterior siguiera: 0010, 0011, 0011, 0010, 0001, 0001, 0001, 0001, 0001, 0001, ... lo podramos codificar como: 10000100,0010,0011,0011,0010,00000110,0001,... este sistema de compresin se llama RLE siglas que corresponden a Run Length Encoding . El sistema anterior funciona muy bien en una imagen con 16 colores y 307200 pixel, pero para otro tipo de datos, no es fcil que aparezcan secuencias largas repetidas, con lo que el mtodo anterior puede no comprimir excesivamente. Supongamos ahora que lo que debemos comprimir es una lista de nombres de personas,. En este caso, no es normal que en un nombre, o en un apellido, aparezca una misma letra seguida, por tanto el esquema anterior es impracticable. Sin embargo en el documento aparecer varias veces la palabra GONZLEZ, en ese caso se puede reemplazar la segunda aparicin de dicha palabra por un texto que diga: colocar aqu la secuencia de ocho letras que esta 45 letras antes, es decir: (8,45)10 = (00001000,00101101)2 es posible que con slo 8 bits tengamos poco margen para que aparezcan cosas repetidas y tengamos que reemplazar el 00101101 por 0000000000101101, que tiene 16 bits, pero en todo caso reducimos un texto de 8 bytes a tan slo 3. En contrapartida, hay que aadir informacin extra, como en el ejemplo anterior, para saber cuando los datos no son repetidos. Este sistema se llama LZW, iniciales de Lempel, Ziv y Welsh que son sus autores, y es el que emplean normalmente los programas compresores, como el PKZIP. Normalmente reduce los ficheros al 50%, aunque con algunos tipos de datos logra incluso ratios mejores de compresin. Finalmente, vamos a explicar el algoritmo de Huffman, es ms complicado que los anteriores, pero tiene una aplicacin ms general.

90

TEMA 5 Codificacin de la informacin

Supongamos ahora que lo que tenemos que comprimir es un texto cualquiera escrito es espaol, en l aparecern palabras repetidas, pero no las suficientes como para que el mtodo LZW pueda reducirlo apreciablemente. La idea es que, todas las letras no aparecen repetidas el mismo nmero de veces, la 'a' se repite ms que la 'z' por poner un ejemplo, por ello, no es lgico emplear el mismo nmero de bits para codificar la 'a' que la 'z'. Se debera emplear para la a un cdigo ms corto y que para la z. Veamos como se hace en la prctica. Por simplificar vamos a suponer que el texto slo contiene las cinco vocales y que la frecuencia de aparicin de cada una es: A 35 E 25 I 20 O 12 U 8

el mtodo consiste en ir agrupando por parejas los valores mnimos y sustituirlos por su suma. En nuestro caso, son 12 y 8 y la suma es 20, por tanto la nueva serie de valores es: 35, 25, 20, 20. Ahora se agrupan los dos 20 para producir 40 y los valores quedan: 35, 25, 40. Los dos menores son en este caso 35 y 25, cuya suma es 60 y finalmente agrupamos el 60 y el 40 y obtenemos el total 100. Si vamos siguiendo el mtodo anterior de modo grfico queda:

A 35 0 60

E 25 1

I 20

O 12 0 20 0 40 1

U 8 1

0 100

ahora para se pone 0 en cada rama de la izquierda y 1 en la de la derecha (se podra hacer tambin a la inversa) y, para obtener el cdigo de cada letra, se sigue desde abajo arriba las lneas, en nuestro caso los cdigos quedan: A = 00, E = 01, I = 10, O = 110, U = 111 Si el texto a comprimir tiene 35 letras A, 25 letras E, etc. el tamao del mismo empleando este cdigo sera de: 352+252+202+123+83 = 220 bits Si por el contrario empleramos longitudes constantes para las letras deberan ser todas de 3 bits con lo cual el resultado sera: 1003 = 300. En este ejemplo, debido a su sencillez, la ganancia no es muy notable, ya que los cdigos de Huffman obtenidos son unos de 2 y otros de 3 bits, mientras que en la codificacin normal seran todos de 3 bits. Ntese que las letras a las que les toca un cdigo de 2 bits son las de uso ms frecuente.

91

Apuntes de Informtica

5.9. Deteccin y correccin de errores Aunque la transmisin de la informacin digital es ms fiable que la analgica, existe siempre una probabilidad no nula de que uno o varios bits sufran alteracin en este proceso. Es decir, que se produzca un error. Vamos primero a ver un par de mtodos que permiten la deteccin de errores y, despus veremos, que tambin pueden corregirse. Todos los mtodos se basan en aadir informacin extra al cdigo que permita detectar o corregir errores. El mtodo ms sencillo de detectar errores en un bit es la paridad. Consiste en aadir un bit extra, en el que se tiene en cuenta si el nmero de bits a 1 del cdigo es par o impar. Hay dos posibilidades: a) la paridad par que aade un bit 1 si hay un nmero impar de unos en el cdigo y 0 si hay un nmero par. Ejemplo: dato=0110, paridad=0. b) la paridad impar que aade un bit 0 si hay un nmero impar de unos en el cdigo y 1 si hay un nmero par. Ejemplo: dato=0100, paridad=0. Si se comete un error en uno de los bits del cdigo el nmero de bits a 1 pasa de par a impar o viceversa, por tanto, la paridad calculada no puede coincidir con la almacenada y el mtodo detecta los errores en un bit. Si se comete un error en dos bits, la paridad calculada y la almacenada coinciden, con lo que no nos enteramos del error. En los ordenadores compatibles PC la memoria se pone en grupos de 9 bits, 8 se emplean para los datos y el noveno para la paridad. Cuando se escribe un dato en memoria se calcula la paridad, y se almacena en el bit noveno; al leer se comprueba, si no coincide se genera un error de paridad y se detiene el sistema. Dado que slo detecta los errores en 1 bit y los errores no suelen ocurrir en un nico bit, el mtodo no es de mucha aplicacin, salvo en casos como la memoria que se supone que es fiable al 100%. En el caso de los discos flexibles o disquetes se emplea un sistema distinto, es lo que se conoce con el nombre de CRC o Cyclic Redundancy Check. Cada sector de datos contiene normalmente 512 bytes de datos y 2 bytes de CRC. El mtodo de clculo es complicado por lo que no lo detallaremos aqu, pero esta pensado para que detecte los errores en varios bit consecutivos. Cuando ocurre un error de CRC, leyendo un sector de disco, el sistema responde con un mensaje de error. Hay ocasiones en que la deteccin de que los datos tienen errores no es suficiente, se necesita algn procedimiento para corregir los errores. El cdigo de Hamming sirve para corregir errores en k bits y, es una aplicacin inyectiva Hk : Bn Bn+r 92

TEMA 5 Codificacin de la informacin

que permite codificar datos de n bits en n+r bits, de modo que a partir de los n+r se pueda recuperar el cdigo original de n bits incluso cuando el cdigo de n+r tenga k bits errneos. En el caso de los cdigos de Hamming los r bits que se aaden son intercalados entre los originales y se obtienen haciendo determinadas sumas de paridad entre los bits de datos. El valor de r depende tanto de n como de k. Dados dos nmeros binarios (con igual cantidad de bits) se define su distancia de Hamming como el nmero mnimo de bits que hay que variar en el primero para convertirlo en el segundo (o lo que es igual el nmero de bits que son distintos en ambos), es obvio que cumple las propiedades de distancia, es decir: a) d(x,y) 0 y d(x,y) = 0 s y slo s x = y. b) d(x,y) = d(y,x). c) d(x,z) d(x,y)+d(y,z) (desigualdad triangular). Para obtener la aplicacin Hk es suficiente con encontrar 2n elementos, xi Bn+r (i = 0,...,2n-1) tales que los conjuntos Xi = {y Bn+r : d(xi,y) k} sean disjuntos, ya que entonces la aplicacin Hk : Bn Bn+r definida por Hk (i) = xi cumple lo que nosotros queremos: si en el elemento i, que nosotros codificamos como xi, se produce un error en a lo sumo k bits, vamos a parar a un elemento de Xi. Como los Xi son disjuntos, eso nos permite recuperar el xi (si j i la distancia a xj es mayor que k y partimos de que el error es a lo sumo de k bits). A partir de xi se recupera despus i. Los elementos xi se pueden obtener eligiendo elementos que cumplan d(x i,xj) = 2*k+1, ya que entonces los conjuntos Xi son disjuntos: si d(y,xi) k y d(y,xj) k, por la desigualdad triangular d(xi,xj) d(xi,y)+d(y,xj) k + k = 2*k en contra de la eleccin de los xi. El procedimiento para obtener la aplicacin Hk es, por tanto, el siguiente: sea x0 = 000...0, x1 ser el mnimo elemento que dista 2*k+1 de x0, es decir x1= 000...111...111, donde se ponen 2*k+1 unos al final; para x2 se toma el mnimo elemento que dista 2*k +1 de x0 y x1, y as sucesivamente. En la prctica se observa que es suficiente hacer esto con los valores de i que son potencias de 2, el resto se calcula descomponindolos en una serie de los anteriores (3=2+1, 7= 4+2+1, etc.) y se suman sus cdigos correspondientes en binario (pero sin contar los acarreos). El valor de r se obtiene de mirar el mximo nmero de bits que requiere el mayor valor a codificar. Siguiendo el procedimiento anterior se puede obtener la siguiente tabla en hexadecimal (en binario sera excesivamente grande): i 1 2 4 8 16 k=1 7 19 2A 4B 181 k=2 1F E3 325 54A 1826 k=3 7F 787 1999 2AAA 4B34 k=4 1FF 3E0F 1C633 64A55 A94AA 93

Apuntes de Informtica

Segn la tabla anterior el cdigo que le corresponde por ejemplo al 5 (4+1) para corregir errores en 2 bits es 32516+1F16 = 1100100101 2+11111 2 = 1100111010 2 = 33A 16. Para el resto de nmeros hasta 8, el lector puede hacer la operacin por el mismo procedimiento y obtener la siguiente tabla para corregir errores en 2 bit: i xi 1 1F 2 E3 3 FC 4 325 5 33A 6 3C6 7 3D9 8 54A

Supongamos que se ha producido un error en 2 bits, y el valor obtenido es, por ejemplo, 11001101102, se tiene entonces: i suma distancia 1 329 5 2 3D5 7 3 3CA 6 4 13 3 5 C 2 6 F0 4 7 EF 7 8 67C 7

La fila con ttulo suma contiene las sumas (en binario y sin los acarreos) entre el cdigo de xi y el cdigo dado y la ltima contiene las distancias que consisten en contar el nmero de bits 1 que tiene cada trmino de la suma. Como se puede observar el cdigo correcto es 5, ya que es el que tiene distancia 2. Para el caso k = 1 se puede hacer de otra forma equivalente: se numeran los bits del cdigo resultante empezando por uno (el ms bajo) es decir bn+r, ..., b2, b1. Los bits que se aaden son los que ocupan las potencias de 2, es decir b1, b2, b4,... en lo sucesivo los llamaremos bits de control, se ponen los suficientes bits hasta que se coloquen todos los bits de datos necesarios (respetando las posiciones de los de control). Por ejemplo, si queremos codificar un dato de 8 bits, necesitamos al menos los bits b1, b2, b4 y b8. Como en los 8 primeros bits hay 4 para datos y 4 para control, y debemos tener 8 para datos, necesitamos hasta b12. La siguiente potencia de 2 es 16, as que desde de b9 hasta b12 no aparecen nuevos bits de control, por lo que tendremos que emplear 12 bits de los cuales 4 (b1, b2, b4 y b8) son de control y el resto de datos. Para averiguar que hay que poner en los bits de control se codifican en binario natural los nmeros del 1 al n+r, en nuestro ejemplo 12, poniendo en las cabeceras los bits de control, que llamaremos ahora Ci, como muestra la tabla siguiente: posicin C8 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 1 9 1 10 1 11 1 12 1 94 C4 0 0 0 1 1 1 1 0 0 0 0 1 C2 0 1 1 0 0 1 1 0 0 1 1 0 C1 1 0 1 0 1 0 1 0 1 0 1 0

TEMA 5 Codificacin de la informacin

para obtener cada Ci hay que sumar los bits correspondientes a los bit 1 de su columna, es decir: C1 = b1+b3+b5+b7+b9+b11 C2 = b2+b3+b6+b7+b10+b11 C4 = b4+b5+b6+b7+b12 C8 = b8+b9+b10+b11+b12 La suma significa suma sin acarreo como siempre (es decir contar la paridad del nmero de 1 que haya en los bits correspondientes) y como es natural para generar el valor no se cuenta a s mismo, es decir para C1 no se suma b1, ... Para detectar los errores en un bit se hallan los valores de C1, C2, ..., pero sumando ahora el bit correspondiente. Si no se han producido errores el valor del bit b 2 es la suma de los restantes que aparecen en Ci, luego al sumarse consigo mismo da cero (sin acarreo 1+1=0 y 0+0=0), luego el valor formado por los Ci es 0. Si hubiera un error en un bit, ese bit forma parte de los Ci necesarios para obtener ese bit en binario, con lo cual dichos Ci apareceran alterados (es decir a 1), y por la propia construccin el nmero ... C2 C1 nos indica el bit errneo, con modificar ese bit y extraer el dato tenemos el dato corregido.
i

Por ejemplo, supongamos que tenemos que codificar el nmero 5, que en binario es 1012. 0 12 0 11 0 10 0 9 0 8 0 7 1 6 0 5 1 4 1 3 0 2 1 1

1 2 3 4 5 6 7 8 9 10 11 12

0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100

11 9 7 5 3, 1

0 11

0 9

0 7 0 7

0 5 1 6

1 3 1 3

1 1 0 2

11 10 7 6 3, 2

0 0 11 10

12 7 6 5, 4

0 12

0 7

1 6

0 5

1 4

12 11 10 9, 8

0 0 0 12 11 10

0 9

0 8

95

La codificacin de 510 utilizando cdigo Hamming para detectar errores en un bit es 000000101101. Supongamos que en la misma alteramos un bit para pasar por ejemplo a 000100101101: 0 11 1 9 0 7 0 7 1 6 0 5 1 6 0 5 1 9 1 3 1 3 1 4 0 8 1 1 0 2

C1=1 C2=0 C3=0 C4=1

0 0 11 10 0 12 0 7

0 0 0 12 11 10

C4 1

C3 0

C2 0

C1 1 10012 Que nos indica que el error est en el bit 9.

Se deja como ejercicio al lector que codifique el 5 segn las tablas generales y que compruebe que el resultado es el mismo. Para concluir este apartado, cabe mencionar que los discos duros suelen emplear un mtodo que no slo permite detectar, sino tambin corregir errores en varios bits, que recibe el nombre de ECC (Error Correction Code ), se codifica al final de los datos y ocupa 32 bits. Tambin las memorias modernas RAM pueden corregir errores con ECC, en lugar de emplear la paridad que slo permite detectar errores en un slo bit.

5.10. Criptografa El vocablo criptografa proviene del griego clsico, y segn la Real Academia de la Lengua Espaola significa: Arte de escribir con clave secreta o de algn modo enigmtico. La criptografa se utiliza para proteger informacin para la cual es posible el acceso ilegal y son ineficaces otros mtodos de proteccin. Esto es aplicable en el caso de las comunicaciones, en las que la informacin debe circular por algn canal pblico. La solucin es buscar un mecanismo de transformacin de los mensajes (texto sencillo) a una forma ininteligible (texto criptografiado), que carezca de sentido para todos aquellos que no sean los destinatarios legales. Hay que darse cuenta que el hecho de codificar el mensaje, ya supone una encriptacin del mismo, es necesario que el destinatario conozca el mtodo de codificacin empleado para que pueda leer el mensaje. Segn esto, la forma ms simple de encriptar un mensaje, es codificndolo segn un m todo de uso particular, en lugar de uno de uso pblico. Es suficiente inventar un cdigo similar al ASCII, pero con cdigos distintos para las letras, que conozcan emisor y receptor para 96

TEMA 5 Codificacin de la informacin

enviarse los mensajes. Este mtodo es muy poco eficaz, ya que con anlisis de frecuencia de las letras es muy fcil de descubrir cul es el cdigo empleado y por tanto descifrar los mensajes. Por ello, es preciso emplear mtodos ms sofisticados, el emisor debe conocer una funcin E que le permita encriptar el texto y el receptor debe conocer una funcin D que le permita desencriptar el texto. En principio se podra pensar que deben ser ambas guardadas celosamente, pero no es necesariamente as. Existen sistemas de clave pblica en los que el receptor explica cual es el mecanismo de E, con lo cual cualquier persona puede mandarle mensajes cifrados, que slo l sabr descifrar, ya que el algoritmo que realiza la funcin D no se deduce (al menos fcilmente) del de E y slo lo conoce el destinatario del mensaje. El sistema ms conocido de clave pblica es RSA, en l las funciones D y E son en realidad exponenciales modulares, es decir existen dos nmeros d y e tales que D(m) = md mod p y E(m) = me mod p, siendo mod p la operacin de encontrar el resto al dividir por p y, m el mensaje codificado en binario. El nmero p es elegido por el receptor, siendo este la clave de la seguridad del cdigo. Para que el receptor pueda decodificar el mensaje debe cumplirse que D(E(m))=m mod p, es decir, que me d = m mod p. Para que siempre se cumpla esta ecuacin el destinatario elige adecuadamente d y e, pero sin la descomposicin en factores primos de p, no se puede encontrar el valor de d, an siendo conocidos p y e. Tambin se cumple la relacin inversa E(D(m))= m mod p. Adems de la necesidad de encriptar mensajes, existe otra necesidad, la de asegurarse de que un mensaje proviene de quin dice que lo enva. Veamos como se puede lograr eso a partir del mtodo anterior. Supongamos que dos personas A y B quieren mantener correspondencia y que eligen el sistema anterior, denotemos DA, EA las funciones elegidas por la persona A y DB, EB las anlogas de B. Cuando A desea enviar el mensaje m a B, lo codifica como m = EB(DA(m)), B para leerlo debe hacer m = EA(DB(m)). Segn este mtodo nadie distinto de A puede haber enviado el mensaje a B, ya que A es el nico que conoce DA y B puede estar seguro de que el mensaje proviene de A. Por otra parte, como slo B conoce DB, la nica persona que puede decodificar el mensaje es B, quedando as asegurado que el mensaje lo ha enviado A y que slo es legible para B. Normalmente no se encripta el mensaje entero con DA, sino un resumen del mismo obtenido con una funcin de hash, el destinatario desencripta el resumen y lo compara con el generado directamente y si coinciden puede suponer que el mensaje no ha sido alterado.

5.11. Codificacin fsica de los datos En este apartado vamos a ocuparnos de como se escriben fsicamente los datos en los disquetes, discos duros y CDROM. El motivo de esto es que la codificacin fsica implica una nueva traduccin para adaptarse a las posibilidades que presenta el material sobre el que se escribe.

97

Apuntes de Informtica

Empecemos con los disquetes, en un disquete la informacin se almacena en forma de campo magntico, aprovechando que puede tener 2 orientaciones, lo cual es muy oportuno para representar datos binarios. Ingenuamente se podran codificar los ceros por el campo magntico con una orientacin y los unos con la opuesta, pero ese sistema est condenado al fracaso. Los datos se leen en el disquete con una cabeza que permanece fija mientras el disco gira por debajo de ella, si se produce una variacin de un 1 por mil en la velocidad de giro, a partir del bit mil estaremos leyendo donde no corresponde, por tanto no se puede emplear el esquema citado. Por razones prcticas se codifican los bit 0 como una permanencia del campo magntico actual y los bit 1 por un cambio del mismo. Supongamos ahora que codificamos segn este nuevo mtodo una serie larga de bits 1, cada bit implica un cambio del campo magntico, lo que permite sincronizar el punto de lectura y liberarnos del problema de las variaciones en la velocidad. Sin embargo, si debemos codificar una serie larga de bits 0, el problema persiste, no podemos saber si hemos ledo 1000 o 1001 ceros seguidos; en este caso no tenemos informacin para sincronizarnos. Segn lo anterior hay un mtodo relativamente simple de poder leer los datos correctamente, es suficiente con introducir entre cada par de bits de datos un bit, llamado bit de reloj, puesto siempre a 1, cuya misin es sincronizar la velocidad de lectura y que permite as codificar series de muchos ceros seguidos sin problemas, pero que desperdicia la mitad de la capacidad del disco para las seales de reloj. Este es el mtodo ms primitivo de codificacin que recibe el nombre de FM ( Modulacin de Frecuencia ). Por ejemplo el dato 1001100101... se codifica 1101011111010111011... Si uno piensa un poco ms profundamente sobre el asunto encuentra otro mtodo, inspirado en el anterior, que permite conservar la capacidad intacta del disco, y que contiene a su vez las seales necesarias para no perder la sincronizacin. El problema era la repeticin de ceros seguidos, por tanto la solucin es incluir un bit de reloj, como antes, pero que slo sea 1 entre cada par de bits a 0, en el resto de casos es siempre 0, este mtodo recibe el nombre de MFM (Modulacin de Frecuencia Modificado ) y es el empleado actualmente en las unidades de disquete de los ordenadores compatibles. Volviendo al ejemplo anterior, ahora quedara codificado como: 1001001010010010001..., puede que no se note mucho la diferencia con el caso anterior, pero es muy notable, ahora como mnimo hay un cero entre un par de unos consecutivos, y como mximo 3. Si codificramos a la misma velocidad que en el mtodo anterior, la distancia mnima entre dos cambios del campo magntico sera el doble que en el caso anterior. Dado que se supone que la superficie magntica es de la misma calidad y soporta el mismo nmero de cambios de campo magntico que en el caso anterior, podemos enviar los datos a la cabeza magntica al doble de velocidad que antes y en consecuencia duplicar la capacidad del disco. Como la mitad de los datos son slo seales de reloj, no necesarias, el disco queda con la capacidad que tena originalmente. Para los discos duros el mtodo anterior es insuficiente, pero se puede refinar la idea. El mtodo empleado llamado RLL2.7 consiste en encontrar una codificacin (ya no tan sencilla como la MFM) que duplique el tamao de los datos, pero consiguiendo un mnimo de 2 y un mximo de 7 ceros (de ah los nmeros del nombre) entre cada par de unos seguidos. Segn el razonamiento anterior, se pueden enviar los datos al triple de velocidad, pero slo estamos

98

TEMA 5 Codificacin de la informacin

empleando el doble de bits para codificar un dato, por tanto obtenemos un 50% extra de capacidad en el disco.

La tabla de la codificacin RLL2.7 est a continuacin: Dato 000 0010 0011 010 011 10 11 RLL2.7 000100 00100100 00001000 100100 001000 0100 1000

como puede observarse emplea cdigos de longitud variable tanto para la entrada como para la salida, pero siempre duplica el tamao de los datos de entrada y la traduccin es unvoca en los dos sentidos. Existe otro mtodo del mismo tipo pero de caractersticas ms avanzadas llamado RLL3.9. En el caso de los CDROM el procedimiento es similar al RLL. Hay que tener en cuenta que, en el caso del CDROM, lo que se emplea para codificar no es un campo magntico, sino reflectividad, salvo eso y la tabla de traduccin el resto es idntico. Los 1 se codifican como cambios de reflectividad y los 0 como permanencias y se traduce con una tabla de 8 bits a 14 bits, por lo que el mtodo se llama EFM (Eight to Fourteen Modulation), el principio de dicha tabla es el siguiente: dato 00000000 00000001 00000010 00000011 00000100 00000101 00000110 EFM 01001000100000 10000100000000 10010001000000 10001000100000 01000100000000 00000100010000 00010000100000

en este caso el mnimo nmero de bits 0 consecutivos entre dos bits 1 es de 2 y el mximo es de 11, adems entre cada byte codificado en 14 bits se incluyen 3 bits extra, por lo tanto, la ganancia de capacidad es, en este caso, del 41%, un poco inferior al RLL2.7.

99

Apuntes de Informtica

Ejercicios del Tema 5 1. Escribir el nmero -12345 en binario en notacin complemento a dos con 16 bits y convertirlo despus a hexadecimal. RESPUESTAS: 1100111111000111, CFC7. 2. Escribir el nmero 1.23456e7 en coma flotante, empleando 24 bits para la mantisa del bit 0 al 22, suprimiendo el ms significativo y poniendo el menos significativo en el bit 0. El exponente se codifica con notacin exceso sumando 127 y est en los bits 23 al 30 y el signo se codifica en el bit 31. RESPUESTA: 0 10010110 01111000110000100000000 (en hexadecimal 4B3C6100). 3. Sumar y multiplicar los nmeros binarios 101110 y 1001. Comprobar el resultado pasando a decimal. RESPUESTAS: 110111, 110011110, 46, 9, 55, 414. 4. Codificar la palabra supercalifragilisticoespiralidoso de las siguientes formas: a) En ASCII. b) En cdigo de Hamming (a partir del ASCII) en grupos de 8 bits y para corregir errores en un bit. c) En cdigo de Huffman. RESPUESTAS: a) y b) en hexadecimal y c) en binario) a) 73 75 70 65 72 63 61 6C 69 66 72 61 67 69 6C 69 73 74 69 63 6F 65 73 70 69 72 61 6C 69 64 6F 73 6F b) 79E 7AD 780 62C 799 61F 606 660 64D 632 799 606 635 64D 660 64D 79E 7AA 64D 61F 67E 62C 79E 780 64D 799 606 660 64D 62B 67E 79E 67E c) Una posible solucin es: u=10100, f=10101, g=10110, t=10111, d=0100, e=0101, c=1000, p=1001, o=1110, r=1111, a=000, l=001, s=011, i=110; 011 10100 1001 0101 1111 1000 000 001 110 10101 1111 000 10110 110 001 110 011 10111 110 1000 1110 0101 011 1001 110 1111 000 001 110 0100 1110 011 1110 5. Se ha recibido el siguiente mensaje codificado con cdigo de Hamming con errores: 5AE 79C 7AB 47E 2C2 72C 69E FAA 616 2C2 647 602 640, corregir los errores y encontrar el mensaje original (en ASCII). RESPUESTA: Esto esta mal. 6. Decodificar el mensaje con el cdigo de Huffman de la respuesta c) del problema 4: 1010110100101111010011111110. RESPUESTA: futuro

100

También podría gustarte