Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Temas de la clase 2
1 - Contenidos
Cantidades enteras y fracciones.
Aritmética digital: suma y resta en otras bases, método del reloj.
Complementos, resta por complemento a la base y a la base
menos uno.
Códigos y representaciones. BCD natural, XS-3, AIKEN, EBCDIC y
ASCII .
Detección y corrección de errores. Código de Hamming. Código
de Grey.
Representación según IEEE 754.
Contenidos:
• Los sistemas numéricos de distintas bases.
• El sistema numérico binario, su conveniencia tecnológica. Concepto de palabra.
• El sistema numérico, octal y hexadecimal. Métodos de Conversión.
• Expresión generalizada de representaciones de cantidades enteras y fracciones.
• Códigos y representaciones. Conceptos básicos.
• Aritmética digital. Suma y resta en binario, octal y hexadecimal.
• Complementos. Sustracción por complementos.
• Definición de Código. Propiedades. Paridad.
• Detección y corrección de errores. Código de Hamming. Código de Grey.
• Sistema de punto flotante. Representación de números en formato ANSI de simple y doble
precisión. Representación según IEEE 754. Justificación. Uso de formato BCD.
8 – Códigos y representaciones
Los seres humanos nos comunicamos de forma oral por medio de idiomas y dialectos (lenguajes
naturales), pero las computadoras sólo pueden representar información internamente por medio
de elementos físicos que pueden estar en dos estados, que hemos representado con 0 y 1.
Desde el inicio de la computación, en la década de 1940 , se vio esta necesidad y se comenzaron
a idear distintas técnicas y formas de efectuar esta representación de información y se las llamó
códigos.
Las primeras computadoras se usaron para cálculos matemáticos exclusivamente, por lo que sus
códigos se idearon para representar datos numéricos, pero luego aparecieron otros que
permitieron representar además letras, símbolos especiales y caracteres de control.
Las primeras codificaciones usadas establecieron una correspondencia entre los símbolos del
sistema numérico decimal y una cantidad determinada de símbolos binarios. La menor cantidad
de símbolos binarios que podían representar a los diez símbolos decimales es cuatro y así
apareció el código BCD (Binary-Coded-Decimal) natural, también llamado BCD 8-4-2-1 por el
peso asignado a cada bit.
Luego se ideó otro código en base al BCD 8-4-2-1 pero desplazado tres lugares respecto a este
en la tabla, razón de su nombre XS-3 o exceso de 3 y otro código ideado fue el AIKEN, que desde
el símbolo 0 al 4 se codifica igual al BCD 8-4-2-1 pero a partir de allí, el 5 es el negado del 4
(negar es cambiar los 1 por 0 y los 0 por 1), el 6 es el negado del 3, el 7 es el negado del 2, el
8 es el negado del 1 y el 9 es el negado del 0, y tiene un peso asignado de 2-4-2-1 a cada bit.
Código Hamming
Ir a la navegaciónIr a la búsqueda
En informática, el código de Hamming es un código detector y corrector de errores que lleva el
nombre de su inventor, Richard Hamming. En los datos codificados en Hamming se pueden detectar
errores en un bit y corregirlos, sin embargo no se distingue entre errores de dos bits y de un bit (para lo
que se usa Hamming extendido). Esto representa una mejora respecto a los códigos con bit de
paridad, que pueden detectar errores en sólo un bit, pero no pueden corregirlo.
Índice
1Códigos pre-Hamming
o 1.1Paridad
o 1.2Dos entre cinco
o 1.3Repetición
2Códigos Hamming
o 2.1Hamming (7,4)
3Ejemplo
4Hamming Extendido
Códigos pre-Hamming[editar]
Antes de los códigos Hamming se utilizaron ciertos códigos detectores de error, como lo fueron el
código linteing, pero ninguno llegó a ser tan eficaz como los de Hamming. A continuación se describen
algunos de estos códigos.
Paridad[editar]
La paridad consiste en añadir un bit, denominado bit de paridad, que indique si el número de los bits de
valor 1 en los datos precedentes es par o impar. Si un solo bit cambiara por error en la transmisión, el
mensaje cambiará de paridad y el error se puede detectar (nótese que el bit donde se produzca el error
puede ser el mismo bit de paridad). La convención más común es que un valor de paridad 1 indica que
hay un número impar de unos en los datos, y un valor de paridad de 0 indica que hay un número par
de unos en los datos.
La comprobación de paridad no es muy robusta, dado que si cambia de forma uniforme un número par
de bits, el bit de paridad será válido y el error no será detectado. Se utiliza cuando se cumplen
simultáneamente dos condiciones: que la probabilidad de que falle un bit es baja y que las fallas de bits
son sucesos independientes. De esta forma la probabilidad de que fallen dos (o más) bits es muy baja,
por lo que cuando no detecta error es altamente probable que el código sea efectivamente correcto.
Cabe destacar que dichas condiciones se ajustan al caso de las memorias de las computadoras
modernas pero no ocurre lo mismo con los dispositivos de almacenamiento que guardan la información
en forma serial (un bit a continuación de otro) ni con los sistemas de transmisión de datos seriales ya
que en estos casos el hecho que falle un bit está vinculado, en forma no despreciable, a la falla de otro
adyacente.
Por otro lado, la paridad, aunque puede detectar que hay error, no indica en qué bit se cometió, si bien
la sobrecarga que produce este método es muy baja, desde un punto de vista computacional como de
espacio (1 solo bit). Los datos se deben desechar por entero y volverse a transmitir. En un medio
ruidoso, una transmisión correcta podría tardar mucho tiempo o incluso, en el peor de los casos, no
darse nunca.
Este código seguía únicamente detectando errores por cambio en un solo bit; si en un mismo penta-
bit(cadena de 5 bit's) un 0 cambiaba a 1 y un 1 cambiaba a 0, la regla de dos-entre-cinco se seguía
cumpliendo y el error quedaba sin descubrir.
Repetición[editar]
Otro código utilizado, consistía en repetir cada bit de datos varias veces para asegurarse de que la
transmisión era correcta. Por ejemplo, si el bit de datos que se envía fuera un 1, un código de
repetición con n=3, enviaría "111". Si los tres bits recibidos no eran idénticos, había un error. En un
ambiente sin demasiado ruido, la mayoría de las veces solamente cambiaría un bit en cada paquete de
tres bits. Por lo tanto, datos del tipo 001, 010, y 100 se corresponden al bit 0, mientras que 110, 101, y
011 se corresponden con el bit 1. Un código con esta capacidad de reconstruir el mensaje original en
la presencia de errores se conoce como código corrector de errores.
Sin embargo, este código no puede reparar correctamente todos los errores. En nuestro ejemplo, si el
error en la transmisión provocara el cambio simultáneo de dos bits y el receptor recibiera "001", el
sistema detectaría el error, pero considerando que el bit original era 0, lo cual es incorrecto. Si se
aumenta el número de veces que se repite cada bit a cuatro (n=4), es posible detectar los errores en
dos bits pero obviamente no se podrán corregir; con cinco, es posible corregir errores de dos bits, pero
no lo podrá hacer en errores de tres bits.
Por otra parte, el código de la repetición es extremadamente ineficaz, pues reduce la velocidad de
transmisión por tres en nuestro ejemplo original y su eficacia cae drásticamente al aumentar el número
de veces que cada bit se repite para detectar y corregir más errores. El uso del código de bloques no
lineales para detección de errores no es muy implementado por lo tanto emplearemos el código de
errores lineales para la corrección de errores.
Códigos Hamming[editar]
Si se añaden junto al mensaje más bits detectores-correctores de error y si esos bits se pueden
ordenar de modo que diferentes bits de error producen diferentes resultados, entonces los bits
erróneos podrían ser identificados. En un conjunto de siete bits, hay sólo siete posibles errores de bit,
por lo que con tres bits de control de error se podría especificar, además de que ocurrió un error, en
qué bit fue.
Hamming estudió los esquemas de codificación existentes, incluido el de dos entre cinco, y generalizó
sus conclusiones. Para empezar, desarrolló una nomenclatura para describir el sistema, incluyendo el
número de los bits de datos y el de los bits detectores-correctores de error en un bloque. Por ejemplo,
la paridad incluye un solo bit para cualquier palabra de datos, así que las palabras del Código
ASCII que son de siete bits, Hamming las describía como un código (8.7), esto es, un total de 8 bits de
los cuales 7 son datos. con base a la anterior repetición, sería un código (3.1), siguiendo la misma
lógica. La relación de la información es el segundo número dividido por el primero, por nuestro ejemplo
de la repetición, 1/3.
Hamming también estudió los problemas que surgían al cambiar dos o más bits a la vez y describió
esto como "distancia" (ahora llamada distancia de Hamming en su honor). La paridad tiene una
distancia de 2, dado que cualquier error en dos bits no será detectado. La repetición (3.1)tiene una
distancia de 3, pues son necesarios el cambio simultáneo de tres bits para obtener otra palabra de
código. La repetición (4.1) (cada bit se repite cuatro veces) tiene una distancia de 4, así que el cambio
de dos bits en el mismo grupo quedará sin definir.
Hamming (7,4)[editar]
Hoy, el código de Hamming se refiere al (7.4) que Hamming introdujo en 1950. El código de Hamming
agrega tres bits adicionales de comprobación por cada cuatro bits de datos del mensaje. El algoritmo
de Hamming (7.4) puede corregir cualquier error de un solo bit, pero cuando hay errores en más de un
bit, la palabra transmitida se confunde con otra con error en un solo bit, siendo corregida, pero de
forma incorrecta, es decir que la palabra que se corrige es otra distinta a la original, y el mensaje final
será incorrecto sin saberlo. Para poder detectar (aunque sin corregirlos) errores de dos bits, se debe
añadir un bit más, y el código se llama Hamming extendido. El procedimiento para esto se explica al
final. El algoritmo es el siguiente:
1. Todos los bits cuya posición es potencia de dos se utilizan como bits de paridad (posiciones 1, 2, 4,
8, 16, 32, 64, etc.).
2. Los bits del resto de posiciones son utilizados como bits de datos (posiciones 3, 5, 6, 7, 9, 10, 11,
12, 13, 14, 15, 17, etc.).
3. Cada bit de paridad se obtiene calculando la paridad de alguno de los bits de datos. La posición del
bit de paridad determina la secuencia de los bits que alternativamente comprueba y salta, a partir de
éste, tal y como se explica a continuación. Posición 1: salta 0, comprueba 1, salta 1, comprueba 1, etc.
Posición 2: salta 1, comprueba 2, salta 2, comprueba 2, etc. Posición 4: salta 3, comprueba 4, salta 4,
comprueba 4, etc. Posición 8: salta 7, comprueba 8, salta 8, comprueba 8, etc. Posición 16: salta 15,
comprueba 16, salta 16, comprueba 16, etc. Regla general para la posición n es: salta n-1 bits,
comprueba n bits, salta n bits, comprueba n bits... Y así sucesivamente. En otras palabras, el bit de
paridad de la posición comprueba los bits en las posiciones que tengan al bit k en su representación
binaria. Dicho a la inversa, el bit 4, chequea los bits 4, 5, 6, 7, al ser estos los de su representación
binaria: 4=100(2), 5=101(2), 6=110(2) y 7=111(2). Por el contrario, el mismo bit de paridad no
comprueba el bit 8, debido a que en su representación binaria el bit número 3 (=4) es igual a 0
(8=1000B). Así, por ejemplo, para los primeros términos se tiene: En la Posición 1 (2^0 = 1),
comprobaríamos los bits: 1, 3, 5, 7, 9, 11, 13... En la Posición 2 (2^1 = 2), los bits: 2, 3, 6, 7, 10, 11, 14,
15... En la Posición 4 (2^2 = 4), los bits: 4, 5, 6, 7, 12, 13, 14, 15, 20, 21, 22, 23... En la Posición 8 (2^3
= 8) tendríamos: 8, 9, 10, 11, 12, 13, 14, 15, 24-31... Siguiendo el algoritmo hasta completar la nueva
cadena.
Ejemplo[editar]
Consideremos la palabra de datos de 7 bits "0110101". Para ver cómo se generan y utilizan los
códigos Hamming para detectar un error, observe las tablas siguientes. Se utiliza la d para indicar los
bits de datos y la p para los de paridad.
En primer lugar los bits de datos se insertan en las posiciones apropiadas y los bits de paridad
calculados en cada caso usando la paridad par.
p1 p2 d1 p3 d2 d3 d4 p4 d5 d6 d7
p1 1 0 1 0 1 1
p2 0 0 1 0 0 1
p3 0 1 1 0
p4 0 1 0 1
La nueva palabra de datos (con los bits de paridad) es ahora "10001100101". Consideremos ahora
que el bit de la derecha, por error, cambia de 1 a 0. La nueva palabra de datos será ahora
"10001100100".
Sin errores
Prueba de Bit de
p1 p2 d1 p3 d2 d3 d4 p4 d5 d6 d7
paridad comprobación
Palabra de datos
1 0 0 0 1 1 0 0 1 0 1 1
recibida:
p1 1 0 1 0 1 1 Correcto 0
p2 0 0 1 0 0 1 Correcto 0
p3 0 1 1 0 Correcto 0
p4 0 1 0 1 Correcto 0
Comprobación de los bits de paridad (con primer bit de la derecha sin cambiar)
Con errores
Prueba de Bit de
p1 p2 d1 p3 d2 d3 d4 p4 d5 d6 d7
paridad comprobación
Palabra de datos
1 0 0 0 1 1 0 0 1 0 0 1
recibida:
p1 1 0 1 0 1 0 Error 1
p2 0 0 1 0 0 0 Error 1
p3 0 1 1 0 Correcto 0
p4 0 1 0 0 Error 1
El paso final es evaluar los bits de paridad (recuerde que el fallo se encuentra en d7). El
valor entero que representan los bits de paridad es 11 (si no hubieran ocurrido errores este
valor seria 0), lo que significa que el bit décimo primero de la palabra de datos (bits de
paridad incluidos) es el erróneo y necesita ser cambiado.
p4 p3 p2 p1
Binario 1 0 1 1
Decimal 8 2 1 Σ = 11
1) Si el signo del numeral es positivo el primer bit, el bit de signo de la posición 31, es
cero (0) sino es uno (1).
5) Al exponente obtenido colocarlo en los ocho (8) bits siguientes al de signo ( bits desde
la posición 30 a la 23 inclusive).
6) Colocar la mantisa obtenida del numeral binario normalizado ( recordar que el bit que
está a la izquierda de la coma decimal no se considera (bit fantasma)) en los veintitrés
(23) bits siguientes a los ocho bits del exponente ( bits desde la posición 22 a la 0
inclusive).
3878 | 16
67 242 | 16
38 82 15 | 16
6 2 15 0
8 bits para el exponente (bits 23 al 30) exponente 138 (127 + 11) = 1000 1010
1 0 0 0 1 0 1 0
8 bits para el exponente (bits 23 al 30) exponente 136 (9 + 127) = 1000 1000
1 0 0 0 1 0 0 0
Figura - Representación de un número real con precisión simple en el estándar IEEE 754.
El exponente se suele representar en Exceso a 2n-1-1, mientras que, para la mantisa, normalmente
se utiliza Signo Magnitud. Además, la mantisa se suele normalizar colocando la coma decimal a la
derecha del bit más significativo.
1,0111001010111010000111
El resto de bits no se pueden representar, ya que, no caben en la mantisa. Sin embargo, cuando la
mantisa se normaliza situando la coma decimal a la derecha del bit más significativo, dicho bit
siempre vale 1. Por tanto, se puede prescindir de él, y coger en su lugar un bit más de la mantisa.
De esta forma, la precisión del número representado es mayor. Así, los bits de la mantisa serán:
01110010101110100001111
Al bit omitido se le llama bit implícito. Por otra parte, el bit de signo vale 0, ya que, el número es
positivo. En consecuencia, el número se puede representar como:
Los programadores, para representar a los números reales en este formato, suelen utilizar el
Sistema Hexadecimal.
Así pues,
En este caso, los números no son exactamente iguales, ya que, con precisión simple no se han
podido representar todos los bits de la mantisa.
Ejemplo 2: Dado el número 3E400000CFL del estándar IEEE 754 con precisión simple,
exponente en Exceso a 2n-1-1 y mantisa en Signo Magnitud con bit implícito, para averiguar a qué
número representa en base 10, se pueden realizar los siguientes pasos:
011111002 - (28-1 - 1)10 = 12410 - (27 - 1)10 = 12410 - (128 - 1)10 = 12410 - 12710 = -3
4º) Escribir el número en notación científica. Para ello, la mantisa se debe escribir con el bit
implícito (1), seguido de la coma decimal (,) y de los bits de la mantisa
(10000000000000000000000), teniendo en cuenta que los ceros por la derecha se pueden
despreciar. Por otra parte, el número es positivo, ya que, el bit de signo es 0. Por tanto, el número
es:
-3
1,1 x 2
5º) Expresar el número en base 10. Para ello, hay dos formas de hacerlo, la primera es:
-3 -3 -4
1,1 x 2 = 0,00112 = ( 2 + 2 )10 = 0,12510 + 0,062510 = 0,187510
y la segunda:
1,1 x 2-3 = ( ( 20 + 2-1) x 2-3 )10 = ( ( 1 + 0,5) x 0,125 )10 = ( 1,5 x 0,125 )10 = 0,187510
Por tanto,
Figura - Representación de un número real con precisión doble en el estándar IEEE 754.
Ejemplo 3: Si se quiere escribir el número 19,562510 en el estándar IEEE 754 con precisión
n-1
doble, exponente en Exceso a 2 -1 y mantisa en Signo Magnitud con bit implícito, los pasos a
seguir son:
De modo que,
19,562510 = 10011,10012
2º) Normalizar el número binario obtenido, colocando la coma decimal a la derecha del bit más
significativo:
10011,10012 = 1,00111001 x 24
n-1
3º) Escribir el exponente en Exceso a 2 -1:
11-1 10
410 + (2 - 1)10 = 410 + (2 - 1)10 = 410 + (1024 - 1)10 = 102710 = 10000000011EX. a 1023
4º) Establecer la mantisa utilizando bit implícito. Para ello, se cogen los ocho bits que están a la
derecha de la coma (00111001) y el resto de la mantisa se rellena con ceros:
0011100100000000000000000000000000000000000000000000
5º) Expresar el número en el estándar IEEE 754 con precisión doble. En este caso, hay que tener
en cuenta que el bit de signo vale 0, ya que, el número es positivo:
Figura - Casos especiales en el estándar IEEE 754 con precisión simple o doble.
Los dos últimos casos merecen especial atención, ya que, cuando todos los bits del exponente son
ceros (00...0), esto quiere decir que no se está utilizando bit implícito. Si, además, la mantisa es
todo ceros (00...0), el número representado es el cero (0), pero si la mantisa es distinta de todo
ceros, el número que se está representando es muy pequeño, de forma que, el exponente valdrá -
126 ó -1022, dependiendo de si el número está escrito en precisión simple o doble,
respectivamente.
Ejemplo 4: Dado el número 805C0000CFL del estándar IEEE 754 con precisión simple,
exponente en Exceso a 2n-1-1 y mantisa en Signo Magnitud con bit implícito, para averiguar a qué
[Escribir texto] Página 14
[Escribir texto]
3º) Al observar que todos los bits del exponente son ceros (00000000) y la mantisa es distinta de
todo ceros, se deduce que es un caso especial. Se está representado a un número muy pequeño
sin bit implícito y, por tanto, el exponente es -126.
4º) En notación exponencial, puesto que en este caso no se utiliza bit implícito, la mantisa se
escribe con un cero (0), seguido de la coma decimal (,) y de los bits de la mantisa
(10111000000000000000000). En cuanto al signo del número, es negativo, ya que, el bit de signo
es 1. Con todo ello, el número es:
-0,10111 x 2-126
Figura - Cálculo del valor en base 10 de un número escrito en IEEE 754 con precisión simple.
Figura - Cálculo del valor en base 10 de un número escrito en IEEE 754 con precisión doble.