Codigos Binarios
Codigos Binarios
Codigos Binarios
Historia
El antiguo matemático Indio “Pingala” presentó la primera descripción que se
conoce de un sistema de numeración binario en el siglo tercero antes de Cristo, lo cual
coincidió con su descubrimiento del concepto del número cero.
• 0+0=0
• 0+1=1
• 1+0=1
• 1+1=0 y se lleva 1
100110101
11010101
----------------
1000001010
• 0–0=0
• 1–0=1
• 1–1=0
10001 11011001
-01010 -10101011
------ ---------
00111 00101110
1011011 1011011
-0101110 C246 = 1010010 +1010010
-------- --------
0101101 10101101
En el resultado nos sobra un bit, que se desborda por la izquierda. Pero, como el
número resultante no puede ser más largo que el minuendo, el bit sobrante se desprecia.
11011011 11011011
-00010111 C223 = 11101001 +11101001
--------- --------
11000100 111000100
10110 11010110111
1001 101011
--------- -----------------
10110 11010110111
00000 11010110111
00000 00000000000
10110 11010110111
--------- 00000000000
11000110 11010110111
------------------
10010000010111101
Decimales a binarios
100 |_2
0 50 |_2
0 25 |_2 --> 100 => 1100100
1 12 |_2
0 6 |_2
0 3 |_2
1 1
Ejemplo:
100|0
50|0
25|1 --> 1, 25-1=24 y seguimos dividiendo por 2.
12|0
6|0
3|1
1| ------->100 => 1100100
Código Gray
El Código Gray es un caso particular de código binario. Consiste en una
ordenación de 2n números binarios de tal forma que cada número sólo tenga un dígito
binario distinto a su predecesor.
Hay varios algoritmos para generar una secuencia de código Gray (y varios
códigos posibles resultantes, en función del orden que se desee seguir), pero el más
usado consiste en cambiar el bit menos significativo que genera un nuevo código. Este
es un código gray de cuatro bits generado con dicho algoritmo:
Dígito
Dígito decimal Código Gray Código Gray
decimal
0 0000 8 1100
1 0001 9 1101
2 0011 10 1111
3 0010 11 1110
4 0110 12 1010
5 0111 13 1011
6 0101 14 1001
7 0100 15 1000
Binario a Gray
Para pasar un número binario al código binario Gray, hay una regla fácil de
implementar en un lenguaje de programación:
Otros ejemplos:
1010 - 1111
111000 - 100100
011001 - 010101
110101010001 - 101111111001
Otra técnica sencilla para pasar de binario a Gray sin usar un lenguaje de programación
es esta:
1010
101
-----
1111
Otros Ejemplos
111000
11100
------
100100
110101010001
11010101000
------------
101111111001
Gray a Binario
Hacer el cambio contrario es simplemente invertir lo que hace el anterior, de
forma que si se encuentra un cero (siempre que no sea al principio) se debe poner la
cifra anterior; En cambio si pone un 1 es porque la cifra ha cambiado así que si había un
0 ahora se pone un 1 y viceversa.
ASCII fue publicado como estándar por primera vez en 1967 y fue actualizado
por última vez en 1986. En la actualidad define códigos para 33 caracteres no
imprimibles, de los cuales la mayoría son caracteres de control obsoletos que tienen
efecto sobre como se procesa el texto, más otros 95 caracteres imprimibles que les
siguen en la numeración (empezando por el carácter espacio).
Casi todos los sistemas informáticos actuales utilizan el código ASCII o una
extensión compatible para representar textos y para el control de dispositivos que
manejan texto.
ASCII es, en sentido estricto, un código de siete bits, lo que significa que usa cadenas
de bits representables con siete dígitos binarios (que van de 0 a 127 en base decimal)
!"#$%&'()*+,-./0123456789:;<=>?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
`abcdefghijklmnopqrstuvwxyz{|}~
El código ASCII define una relación entre caracteres específicos y secuencias de bits;
además de reservar unos cuantos códigos de control para el procesado de textos, y no
define ningún mecanismo para describir la estructura o la apariencia del texto en un
documento; estos asuntos están especificados por otros lenguajes como los lenguajes de
etiquetas.
Historia
El código ASCII se desarrolló en el ámbito de la telegrafía, y se usó por primera vez
comercialmente como un código de teleimpresión impulsado por los servicios de datos
de Bell. Bell había planeado usar un código de seis bits, derivado de Fieldata, que
añadía puntuación y letras minúsculas al más antiguo código de teleimpresión Baudot,
pero se les convenció para que se unieran al subcomité de la Agencia de Estándares
Estadounidense (ASA), que habían empezado a desarrollar el código ASCII. Baudot
ayudó en la automatización del envío y recepción de mensajes telegráficos, y tomó
muchas características del código Morse; sin embargo, a diferencia del código Morse,
Baudot usó códigos de longitud constante. Comparado con los primeros códigos
telegráficos, el código propuesto por Bell y ASA resultó en una reorganización más
conveniente para ordenar listas (especialmente porque estaba ordenado alfabéticamente)
y añadió características como la 'secuencia de escape'.
Otros órganos de estandarización han publicado códigos de caracteres que son idénticos
a ASCII. Estos códigos de caracteres reciben a menudo el nombre de ASCII, a pesar de
que ASCII se define estrictamente solamente por los estándares ASA/ANSI:
El código 127 (los siete bits a uno), otro carácter especial, equivale a "suprimir"
("delete"). Aunque esta función se asemeja a otros caracteres de control, los diseñadores
de ASCII idearon este código para poder "borrar" una sección de papel perforado (un
medio de almacenamiento popular hasta la década de 1980) mediante la perforación de
todos los agujeros posibles de una posición de carácter concreta, reemplazando
cualquier información previa. Dado que el código 0 era ignorado, fue posible dejar
huecos (regiones de agujeros) y más tarde hacer correcciones.
Muchos de los caracteres de control ASCII servían para marcar paquetes de datos, o
para controlar protocolos de transmisión de datos (por ejemplo ENQuiry, con el
significado: ¿hay alguna estación por ahí?, ACKnowledge: recibido o "acuse de recibo",
Negative AcKnowledge: No recibido, Start Of Header: inicio de cabecera, Start of
TeXt: inicio de texto, End of TeXt: final de texto, etc.). ESCape y SUBstitute permitían
a un protocolo de comunicaciones, por ejemplo, marcar datos binarios para que
contuviesen códigos con el mismo código que el carácter de protocolo, y que el receptor
pudiese interpretarlos como datos en lugar de como caracteres propios del protocolo.
Los diseñadores del código ASCII idearon los caracteres de separación para su uso en
sistemas de cintas magnéticas.
Los primeros usuarios de ASCII adoptaron algunos de los códigos de control para
representar "metainformación" como final-de-línea, principio/final de un elemento de
datos, etc. Estas asignaciones a menudo entraban en conflicto, así que parte del esfuerzo
de convertir datos de un formato a otro comporta hacer las conversiones correctas de
metainformación. Por ejemplo, el carácter que representa el final-de-línea en ficheros de
texto varía con el sistema operativo. Cuando se copian archivos de un sistema a otro, el
sistema de conversión debe reconocer estos caracteres como marcas de final-de-línea y
actuar en consecuencia.
Actualmente los usuarios de ASCII usan menos los caracteres de control, (con algunas
excepciones como "retorno de carro" o "nueva línea"). Los lenguajes modernos de
etiquetas, los protocolos modernos de comunicación, el paso de dispositivos basados en
texto a basados en gráficos, el declive de las teleimpresoras, las tarjetas perforadas y los
papeles continuos han dejado obsoleta la mayoría de caracteres de control.
Rasgos estructurales
• Los dígitos del 0 al 9 se representan con sus valores prefijados con el valor 0011
en binario (esto significa que la conversión BCD-ASCII es una simple cuestión
de tomar cada unidad bcd y prefijarla con 0011).
• Las cadenas de bits de las letras minúsculas y mayúsculas sólo difieren en un bit,
simplificando de esta forma la conversión de uno a otro grupo.
Variantes de ASCII
A medida que la tecnología informática se difundió a lo largo del mundo, se
desarrollaron diferentes estándares y las empresas desarrollaron muchas variaciones del
código ASCII para facilitar la escritura de lenguas diferentes al inglés que usaran
alfabetos latinos. Se pueden encontrar algunas de esas variaciones clasificadas como
"ASCII Extendido", aunque en ocasiones el término se aplica erróneamente para cubrir
todas las variantes, incluso las que no preservan el conjunto de códigos de caracteres
original ASCII de siete bits.
Los estándares de ocho bits como ISO 8859 y Mac OS Roman fueron desarrollados
como verdaderas extensiones de ASCII, dejando los primeros 127 caracteres intactos y
añadiendo únicamente valores adicionales por encima de los 7-bits. Esto permitió la
representación de un abanico mayor de lenguajes, pero estos estándares continuaron
sufriendo incompatibilidades y limitaciones. Todavía hoy, ISO-8859-1 y su variante
Windows-1252 (a veces llamada erróneamente ISO-8859-1) y el código ASCII original
de 7 bits son los códigos de carácter más comúnmente utilizados.
Unicode y Conjunto de Caracteres Universal (UCS) ISO/IEC 10646 definen un
conjunto de caracteres mucho mayor, y sus diferentes formas de codificación han
empezado a reemplazar ISO 8859 y ASCII rápidamente en muchos entornos. Mientras
que ASCII básicamente usa códigos de 7-bits, Unicode y UCS usan "code points" o
apuntadores relativamente abstractos: números positivos (incluyendo el cero) que
asignan secuencias de 8 o más bits a caracteres. Para permitir la compatibilidad,
Unicode y UCS asignan los primeros 128 apuntadores a los mismos caracteres que el
código ASCII. De esta forma se puede pensar en ASCII como un subconjunto muy
pequeño de Unicode y UCS. La popular codificación UTF-8 recomienda el uso de uno a
cuatro valores de 8 bits para cada apuntador, donde los primeros 128 valores apuntan a
los mismos caracteres que ASCII. Otras codificaciones de caracteres como UTF-16 se
parece a ASCII en cómo representan los primeros 128 caracteres de Unicode, pero
tienden a usar 16 a 32 bits por carácter, así que requieren de una conversión adecuada
para que haya compatibilidad entre ambos códigos de carácter.
Un proceso de comunicación puede tener lugar en diversas formas: por ejemplo al hacer
una llamada telefónica, al enviar un telegrama, al usar un lenguaje de signos. En tales
casos, el proceso involucra el flujo de información a través de un medio, el cual va del
remitente al receptor. El medio que lleva la información puede ir de la mímica al habla,
o la electricidad al agua, o una secuencia de dígitos binarios y puede ser tan intangible
como cualquier cosa mediante la cual una mente humana puede afectar a otra. En
cualquier caso, un proceso de comunicación involucra un flujo de información a través
de un sistema.
Por ejemplo, en una conversación entre dos personas, el canal puede estar sujeto a
ruidos, tales como el viento, un carro que pasa, otras voces. En cualquier caso, se trata
de minimizar las pérdidas debidas al ruido y recuperar de una manera óptima el mensaje
original cuando se ha contaminado por la presencia del ruido.
Un dispositivo que se puede usar para mejorar la eficiencia del canal de comunicación
es un codificador que transforma el mensaje que llega de tal manera que se puede
detectar la presencia del ruido en el mensaje transformado. El uso de un codificador
requiere que se use un decodificador para transformar el mensaje codificado a su forma
original que el receptor pueda entender.
Suponiendo que se utilizan sólo palabras del código para la transmisión de datos,
cualquier error introducido durante la transmisión se pondrá de manifiesto
inmediatamente puesto que cambiará palabras del código en palabras que no son del
código. Es decir, si la cadena recibida es una palabra del código, los datos son correctos;
si no es una palabra del código, los datos deben ser erróneos
Si en este ejemplo se cambia un mensaje transportado por un canal, debido a
alteraciones o ruido, entonces el receptor cometerá un error indetectable e incorregible
porque cualquiera intercambio de 0 y 1 en una secuencia de código en especial resulta
en una secuencia de códigos diferentes. Por ejemplo si la secuencia 000 para A se
cambia por ruido a 100 entonces se identificará como 100, entonces, se decodificará
como E.
Se modificará ahora el código al añadirle el dígito extra o redundante a cada secuencia
de 3 bits como se muestra en la siguiente tabla:
Este dígito de más se escoge para que sea 1 si la suma de los tres dígitos del código
original es impar; si no sucede así, se escoge para que sea 0.
Un error sencillo en una secuencia de código en particular produce otra secuencia que
no pertenece al código. Por ejemplo, la secuencia de código 0000 para A se podría
transformar por el ruido en cualquiera de las secuencias 0001, 0010, 0100, 1000.
Obsérvese que la secuencia 0001 se puede producir por un error de un solo dígito de las
secuencias para A, B, C, o E, por consiguiente, no es posible corregir el error. Al
introducir redundancias adicionales, es posible tanto detectar como corregir uno o más
errores por secuencia de códigos.
Un error en un dato binario se define como un valor incorrecto en uno más bits.
La DISTANCIA entre I Y J que se designa por d(I, J), es igual al número de bits en que
difieren I y J.
Ejemplo 6.
Sí I=(01101100) y J= (11000100)
Se elige un entero n > m y una función uno a uno e: Bm Bn.La función e es la función
de codificación. Si a Bm, entonces e(a) Bn, es la palabra codificada que representa
a a. Los ceros y unos adicionales pueden proporcionar el medio para detectar o corregir
los errores producidos en el canal de transmisión así:
Hay que observar que bm+1 es cero si y solo si el número de unos en b es par. Lo anterior
implica que cada palabra calificada e(b) tiene peso par. Un solo error en la transmisión
de la palabra codificada cambia la palabra recibida por una palabra de peso impar y por
lo tanto es posible detectarla. De la misma forma se puede detectar cualquier número
impar de errores.
Ejemplo 8.
e(000) = 0000
e(001) = 0011
e(010) = 0101
e(011) = 0110
e(100) = 1001
e(101) = 1010
e(110) = 1100
e(111) = 1111
Ejemplo 9.
e(00) = 00000
e(11) = 11111
Demostración.
Ejemplo 10.
e(011) = 10010101
e(100) = 10100100
Ejemplo 11.
Considérese la función de codificación definida como e: Bm B3m definida como e(b) =
b1 b2…bmb1 b2…bmb1 b2…bm donde b= b1 b2…bm.
O sea:
E(000)= 000000000
E(001)= 001001001
E(010)= 010010010
E(011)= 011011011
E(101)= 101101101
E(110)= 110110110
E(100)= 100100100
E(111)= 111111111
Si, por ejemplo, se supone b = 011 y que el canal de transmisión recibe 011111011. Esta
no es una palabra codificada, por lo que se ha detectado un error. Así es posible detectar
un error simple y dos errores arbitrarios cualesquiera.
¿Cómo se corregiría?
Es decir la función de decodificación d examina el i-ésimo dígito en cada uno de los tres
bloques trasmitidos.
Se elige el dígito que aparece al menos dos veces en estos tres bloques como el i-esimo
dígito decodificado.
De manera análoga el segundo dígito se decodifica como uno, ya que los tres segundos
dígitos en los tres bloques son unos.
Por ultimo, el tercer dígito también se decodifica como uno, por una razón análoga, por
tanto d(xt)=011. Es decir, este código corrige cualquier error simple.
Hay códigos que permiten simultáneamente detectar y corregir errores; para ello basta
usar un código con una distancia mínima de 2x + y + 1, que permite corregir hasta x
errores de un solo bit y detectar hasta y errores adicionales