Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.
left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Prévia do material em texto

8-1
Capítulo
OITO
Codificações BCD, Numérica e Alfanumérica
8.1 Números e Aritmética BCD
Os computadores digitais atuais trabalham com números binários, uma vez que isto facilita
enormemente a construção destes computadores. No dia-a-dia, entretanto, o sistema decimal
é largamente utilizado (ainda!). Isto obriga a existência de rotinas de conversão de números
decimais para binário e vice-versa; estas rotinas existem em todos os computadores atuais.
Nos computadores mais antigos, entretanto, procurou-se desenvolver uma aritmética binária
que operasse com dígitos decimais, de forma a facilitar estas rotinas de conversão. Neste
sistema, em desuso nos dias de hoje, um grupo codificado de quatro bits é utilizado para
representar cada um dos dez dígitos decimais. Esta é a base do sistema BCD (Binary Coded
Decimal – Decimal Codificado em Binário).
Com quatro bits podem ser codificadas 16 combinações distintas (de 0000 a 1111), mas
existem somente 10 dígitos binários (de 0 até 9). Com isto tem-se 16!/6! = 2,9x1010
diferentes possibilidades para implementar-se uma codificação BCD. Algumas das
combinações mais usuais são ilustradas na tabela apresentada a seguir. A segunda coluna
utiliza o NBCD (Natural BCD), visto que os dígitos são codificados de acordo com sua
representação em binário (com pesos 8,4, 2 e 1 para cada bit). O código de Aiken usa os
pesos 2, 4, 2 e 1 para cada bit, enquanto que o código de Stibitz (também chamado de
excesso de 3) usa os mesmos pesos do NBCD, mas soma três a cada representação. O
código 7421 usa os pesos 7, 4, 2 e 1, enquanto que o código 642-1 utiliza os pesos 6, 4, 2 e
–1.
Dígito decimal Cód. NBCD
(8421)
Cód.Aiken
(2421)
Cód.Stibitz
(8421 – 3)
Cód.7421
(7421)
Cód. 642-1
(642-1)
0 0000 0000 0011 0000 0000
1 0001 0001 0100 0001 0011
2 0010 0010 0101 0010 0010
3 0011 0011 0110 0011 0101
4 0100 0100 0111 0100 0100
5 0101 1011 1000 0101 0111
6 0110 1100 1001 0110 1000
7 0111 1101 1010 0111 1011
8 1000 1110 1011 1001 1010
9 1001 1111 1100 1010 1101
Tabela 8.1 - Codificações BCD
Por sua proximidade do sistema binário, a codificação NBCD é a mais utilizada, e é
denominada por muitos autores simplesmente por BCD, e a aritmética com este código é
denominada de aritmética BCD. Nesta aritmética, os dígitos decimais são operados em
binário, agrupados de quatro em quatro. Quando se soma dois dígitos BCD em binário, o
dígito resultado pode estar em um de três casos:
1. Dígito legal (entre 0 e 9), sem “vai-um”. Neste caso o resultado está correto, e não
existe “vai-um” para o dígito seguinte.
8-2
2. Dígito ilegal sem “vai-um”. Neste caso o resultado está entre 10 e 15 (em binário); para
obter-se o dígito correto deve-se subtrair 10 do dígito (ou somar seis, o que é
equivalente), e gerar-se um “vai-um” para o dígito decimal seguinte.
3. Dígito legal com “vai-um”. Este caso ocorre quando o resultado cai entre 16 e 19; da
mesma maneira que o caso 2, para obter-se o dígito correto deve-se subtrair 10 do
dígito (ou somar seis). O “vai-um” gerado está correto.
Por exemplo, seja A=0832 e B=0983. Então tem-se:
A = 0000 1000 0011 0010
B = 0000 1001 1000 0011
0001 0001 1011 0101
caso 1 caso 3 caso 2 caso 1
Para corrigir o resultado, deve-se somar seis nos dígitos dos casos 2 e 3. No caso 2, ainda é
necessário propagar um “vai-um” (isto não é necessário no caso 3, pois o “vai-um” já foi
gerado).
 1
0001 0001 1011 0101
0110 0110
0001 1000 0001 0101
Com isto tem-se 1815, que é o resultado correto. Uma desvantagem da correção do resultado
dessa maneira é que as correções do tratamento do “vai-um” no caso 2 podem criar novas
correções, como por exemplo no caso de A=0372 e B=0633:
A = 0000 0011 0111 0010
B = 0000 0110 0011 0011
0001 1001 1010 0101
caso 2
Com a correção do caso 2, tem-se:
 1
0000 1001 1010 0101
0110
0000 1010
caso 2
0000 0101
E a nova correção deste novo caso 2 fornece o resultado correto (1005). Para evitar este
tratamento especial, foi criado o algoritmo de Hellerman, que soma 6 em todos os dígitos de
um dos operandos antes da soma das duas parcelas. Assim, só existem dois casos a serem
tratados, distinguidos pelo “vai-um”:
1. O resultado não deu “vai-um” e então caiu entre 6 e 15. Deve-se subtrair 6 para obter o
dígito correto.
2. O resultado produziu um “vai-um”. Então este “vai-um” já foi propagado e o dígito
está correto entre 0 e 9.
Por exemplo, seja A=0372 e B=0633. Então tem-se:
A = 0000 0011 0111 0010
soma de 6 0110 0110 0110 0110
0110 1001 1101 1000
Se a primeira etapa produzir um “vai-um” entre dígitos decimais, isto significa que o dígito
original do operando terá sido ilegal; este número está mal representado. A segunda etapa
realiza a soma de (A+6) com o segundo operando (B):
8-3
 1 1
A+6= 0110 1001 1101 1000
B= 0000 0110 0011 0011
0111
caso 1
0000
caso 2
0000
caso 2
1011
caso 1
Na terceira e última etapa, ao invés de subtrair 6 (0110), soma-se 10 (1010) e ignora-se o
“vai-um”).
0111 0000 0000 1011
1010 1010
0001 0000 0000 0101
O resultado, 1005, já está correto.
Para a subtração utilizam-se técnicas semelhantes. Para maiores detalhes sobre aritmética
BCD pode-se consultar o livro “Projeto de Computadores Digitais”, de Glen George
Langdon Jr. e Edson Fregni, capítulo 2 (Códigos, números e aritmética). As operações de
divisão e multiplicação operam de forma semelhante aos métodos utilizados na nossa
aritmética decimal, mas atuando sobre cada dígito BCD individualmente. Estas operações
não possuem hoje em dia nenhum interesse prático e, devido às extensões dos seus
algoritmos, não serão abordadas aqui.
8.2 Codificação
Os computadores atuais trabalham unicamente com dígitos binários (bits); nenhum outro
símbolo é utilizado. Qualquer informação, seja ela numérica ou alfabética, deve ser
representada utilizando-se combinações adequadas destes bits. A este processo genérico de
representação dá-se o nome de codificação, ou seja, um mapeamento entre os símbolos
utilizados externamente ao computador e os grupos de bits escolhidos para representar estes
símbolos.
Todas as representações de números vistas até o momento (inteiros positivos,
sinal/magnitude, complemento de um, complemento de dois, ponto fixo, ponto flutuante,
BCD) são exemplos de codificações. O objetivo comum a todas estas codificações era
representar números no sistema de numeração arábico; para cada codificação foram
estudadas a maneira de representar os números no sistema binário e inclusive a maneira de
operar com estes números codificados.
Diversas outras aplicações, entretanto, também utilizam códigos. Assim, tem-se códigos
desenvolvidos para manipular caracteres alfanuméricos, símbolos especiais (pontuação,
letras gregas, etc), símbolos matemáticos, e toda a gama de informação que deve ser
manipulada ou armazenada em um computador.
De uma forma geral, se uma determinada codificação utiliza ‘n’ bits, podem ser
representados 2n símbolos distintos, ou seja, tem-se 2n combinações distintas que podem ser
realizadas com estes ‘n’ bits. Os códigos não necessitam utilizar todas as combinações
possíveis (como é o caso dos códigos BCD), nem a informação necessita estar codificada de
forma inequívoca (como é o caso do duplo zero em sinal/magnitude ou de números não
normalizados em ponto flutuante). Cada sistema de codificação pode estabelecer suas
próprias regras de formação e manipulação dos grupos de bits.
8.3 Códigos BCD (ou códigos de 4 bits ponderados)
Conforme já foi visto, nos códigos BCD um grupo codificado de quatro bits é utilizado para
representar cada um dos dez dígitos decimais. Como uma metodologia para realizar
8-4
operações aritméticas estes códigos estão em desuso, mas como uma maneira de armazenar
números decimais eles ainda são utilizados.
Como já foi visto, existem 2,9x1010 diferentes possibilidades para implementar-se uma
codificaçãoBCD. Algumas delas foram analisadas no capítulo anterior. Dois dos códigos
BCD ainda são bastante utilizados hoje em dia: o BCD natural e o código em excesso-de-três
(Stibitz). Ambos estão reproduzidos abaixo:
Dígito decimal NBCD
(8421)
Excesso-de-3
(8421 – 3)
0 0000 0011
1 0001 0100
2 0010 0101
3 0011 0110
4 0100 0111
5 0101 1000
6 0110 1001
7 0111 1010
8 1000 1011
9 1001 1100
Tabela 8.2 - Códigos BCD de 4 bits
O código BCD natural tem uma correspondência “natural” entre os dígitos decimais e a
codificação binária. Os próprios pesos das posições binárias seguem os valores utilizados no
sistema arábico (8, 4, 2 e 1). O código em excesso de três também tem os mesmos pesos,
mas a cada codificação binária soma-se 3.
Para o código NBCD (denominado simplesmente de BCD) foi desenvolvida uma aritmética
binária, conforme já foi visto anteriormente.
O mesmo ocorre com o código de excesso-de-três, que possui duas vantagens: nenhum
código utiliza a combinação 0000, e o código é auto-complementado para 9, ou seja, para se
obter o complemento de 9 de um código decimal, basta inverter todos os bits.
A aritmética em excesso de 3 é relativamente fácil. Quando dois dígitos em excesso de 3 são
somados, o resultado será em excesso de 6, e tem-se dois casos a tratar:
• A soma dos dois dígitos é nove ou menos. Neste caso, a soma em excesso resultará
em um dígito que é 15 ou menos, e nenhum carry será gerado. Nestes casos, basta
subtrair 3 do resultado para obter o dígito corretamente codificado em excesso de 3.
• A soma dos dois dígitos é 10 ou mais. Neste caso, a representação em excesso será
16 ou mais. Como X e X+16 tem o mesmo código, a diferença está na geração de
um ‘vai-um’. Para corrigir o resultado, ou seja, representar X em excesso de 3,
basta somar 3.
Assim, a regra para a soma em excesso de três é simples: soma-se os dígitos usando
aritmética binária; se um ‘vai-um’ é gerado, somar 3 (0011) ao dígito decimal; senão,
subtrair 3 (0011) ao dígito decimal (ou somar 1101 e desprezar o ‘vai-um’).
Diversos outros códigos também podem ser desenvolvidos atribuindo-se pesos distintos às
diversas posições; o nome destes códigos é normalmente formado pelos pesos. Abaixo são
exemplificados alguns deles (4221, 2421 (Aiken), 5421, 7421, e 642(-1), com peso
negativo). Note-se que a escolha dos pesos não determina de forma inequívoca a
codificação, mas apenas facilita sua compreensão. Assim, por exemplo, no código 4221 o
dígito decimal 2 pode ser codificado tanto por 0010 (como na tabela) como por 0100; o
dígito 6 poderia ser codificado como 1010 ou por 1100 (esta última utilizada na tabela).
8-5
Dígito decimal 4221 2421 5421 7421 642(-1)
0 0000 0000 0000 0000 0000
1 0001 0001 0001 0001 0011
2 0010 0010 0010 0010 0010
3 0011 0011 0011 0011 0101
4 1000 0100 0100 0100 0100
5 0111 1011 1000 0101 0111
6 1100 1100 1001 0110 1000
7 1101 1101 1010 0111 1011
8 1110 1110 1011 1001 1010
9 1111 1111 1100 1010 1101
Tabela 8.3 - Códigos BCD pouco utilizados
Cada um destes códigos sempre é desenvolvido com algum propósito ou aplicação específica
em mente. Por exemplo, o código 4221 é auto-complementado em 9 (como o são todos os
códigos cuja soma dos pesos é 9). Nenhum dos códigos da tabela anterior, entretanto, é
apropriado para operações aritméticas.
Outros códigos possíveis seriam 5221, 5321, 6331, 5211, 6321, 7321, 4421, e 6421.
Também são possíveis códigos com pesos negativos, como 531(-1), 522(-1), 732(-1), e
621(-1). Apesar de possíveis, nenhum destes códigos já foi utilizado em qualquer aplicação
prática. Seu estudo foi meramente teórico.
8.4 Códigos de cinco bits ponderados
Várias máquinas (já ultrapassadas) foram desenvolvidas utilizando cinco bits ponderados. O
código 74210, ilustrado na tabela a seguir, é um destes códigos. Ele ainda possui a
vantagem adicional de que todos os dígitos codificados contém dois e somente dois bits em
“um”, o que facilita a verificação se uma palavra pertence ao código ou não.
Dígito decimal Cód. 74210
0 11000
1 00011
2 00101
3 00110
4 01001
5 01010
6 01100
7 10001
8 10010
9 10100
Tabela 8.4 - Código BCD de 5 bits
Os dois “uns” em cada dígito decimal torna possível a detecção de erros simples (erro em um
único bit) em cada dígito. Qualquer dígito que não apresentar “uns”, ou somente um “um”,
ou mais de dois ”uns” pode ser facilmente identificado como errôneo. O valor zero
(codificado como 11000) está contra os pesos utilizados, mas foi assim codificado para
manter a regra dos dois “uns”.
8.5 Códigos de sete bits ponderados
Um código de sete bits ponderados foi utilizado pela IBM, no modelo IBM 650. Este
código, de sete bits com pesos 5043210, é também denominado de biquinário. Ele possui
dois grupos de bits, um com dois e outro com cinco bits. Este código também pode ser
considerado como um código “m de n” (veja-se seção 8.8).
8-6
Dígito decimal 50 43210
0 01 00001
1 01 00010
2 01 00100
3 01 01000
4 01 10000
5 10 00001
6 10 00010
7 10 00100
8 10 01000
9 10 10000
Tabela 8.5 - Código BCD de 7 bits
Nos sete bits de qualquer palavra de código, somente dois bits estão em “um”, os demais são
zeros. Além disto, um destes “uns” está no grupo da esquerda (de dois bits) e o outro “um”
está no grupo da direita (de cinco bits). Qualquer código com uma quantidade de “uns”
diferente de dois, ou com mais de um “um” em cada grupo, indica um dígito inválido ou
então um erro. O grupo à esquerda indica se o dígito é menor ou igual a quatro ou então
maior ou igual a cinco. Operações aritméticas podem ser realizadas com relativa facilidade, o
que contribuiu para o seu uso. As operações aritméticas estão baseadas no fato de um dígito
ser incrementado de uma unidade deslocando-se o ‘1’ para a esquerda. Atualmente este
código caiu em desuso, exceto para algumas aplicações específicas.
Um código semelhante é o qui-binário, com pesos 8, 6, 4, 2, 0 / 1, 0.
8.6 Códigos Gray (ou códigos cíclicos)
Estes códigos não são utilizados para cálculos aritméticos, mas sim para indicar a variação de
grandezas analógicas (temperatura, ângulo, pressão, voltagem, etc) em forma digital. Estas
grandezas não alteram seus valores de forma brusca, mas sim variam de um valor para outro
de forma contínua. Assim, os códigos de Gray foram desenvolvidos de tal forma que, ao se
avançar de um número para o seguinte, somente um bit do código varia, ou seja, dois
códigos adjacentes se diferenciam somente por uma posição binária. Existem diversas
possibilidades para os códigos cíclicos. O código Gray mais comum (denominado
simplesmente de “código Gray“) é mostrado na Tabela 8.6 a seguir.
Dígito decimal Cód. Gray
0 0000
1 0001
2 0011
3 0010
4 0110
5 0111
6 0101
7 0100
8 1100
9 1101
10 1111
11 1110
12 1010
13 1011
14 1001
15 1000
Tabela 8.6 - Código Gray de 4 bits
8-7
Note-se que todas as 16 combinações possíveis estão presentes; não existem combinações
ilegais ou que indiquem erro. Mas de um código para o seguinte sempre existe somente um
bit que varia o seu valor.
Compare-se, por exemplo, a variação de 3 para 4. Em binário, isto implicaria a variação do
código 0011 para 0100, com a troca de valor de três dígitos binários. No código Gray visto
na Tabela 8.6, a variação é de 0010 para 0110, com a troca de somente um bit. Note-se
também que o código é cíclico, ou seja, do valor 15 para zero (ou vice-versa) também existe
a variação de somente um bit.
Para este código Gray pode-se desenvolver procedimentos de conversão para decimal e
binário. Um número decimal pode ser convertido para Gray convertendo-se primeiramente
este número para binário. A seguir, cada bit é somado em módulo dois com o bit à esquerda
(a soma em módulo dois é uma soma sem ‘vai-um’, ou seja, o resultado somente é um
quando os dois operandos forem diferentes).
Por exemplo, o número decimal 45 é representado por 0101101 em binário. E a conversãopara código Gray produz:
0 1 0 1 1 0 1
Ú Ú Ú Ú Ú Ú
1 1 1 0 1 1
Assim, o código Gray de 45 é 111011.
Converter do código Gray para decimal é realizado primeiro convertendo-se de Gray para
binário e depois para decimal. A conversão para binário é realizada analisando-se os bits da
esquerda para a direita. Os zeros bits de mais alta ordem são mantidos inalterados até o
primeiro ‘1’, inclusive. A partir daí, os bits zero são invertidos para um até o próximo ‘1’.
Este ‘1’ também é invertido para zero, e os zeros seguintes são copiados inalterados até o
próximo ‘1’ (que também é copiado). Passa-se então à inversão até o próximo ‘1’, a partir
do qual copia-se normalmente até o ‘1’ seguinte, e assim por diante até serem analisados
todos os bits.
Por exemplo, seja o código Gray 001001011. Convertendo-o para binário tem-se:
• 001 Copia-se todos os zeros até o primeiro ‘1’.
• 001110 Inverte-se os bits seguintes até o próximo ‘1’.
• 00111001 Copia-se todos os bits até o ‘1’ seguinte.
• 001110010 Inverte-se os bits até o próximo ‘1’.
Ou seja, obtém-se 001110010, que corresponde em decimal a 114. Note-se que a regra geral
alterna entre cópia dos bits e a inversão dos bits; cada bit ‘em 1’ indica que deve ser realizada
uma troca (deste ‘1’ inclusive).
Este código Gray em particular é um código binário refletido. Um código é dito refletido
quando ele é simétrico (com exceção do bit de mais alta ordem) em relação ao ponto médio
da lista codificada em ordem crescente de valor. Os códigos Gray que não são refletidos são
complexos de serem codificados.
Existem diversos códigos Gray com diferentes tamanhos de ciclo (números de códigos
distintos utilizados). Normalmente eles são referenciados pelo tamanho do seu ciclo e por
uma lista de números. Por exemplo, o código Gray visto acima é referenciado como sendo
de ciclo 16 (1,2,1,3,1,2,1,4,1,2,1,3,1,2,1,4). Os números da lista indicam a posição (a
partir da direita) do bit que é invertido no código atual para formar o próximo código. A
codificação pode iniciar em qualquer número binário (no caso do exemplo, um número de 4
bits). Por exemplo, um código Gray de comprimento 6 (1,2,1,3,2,3) será diferente se
iniciado em números binários diferentes, conforme pode ser visto na tabela a seguir.
8-8
Dígito Codificação inicial em:
decimal 000 001 010 011 100 101 110 111
0 000 001 010 011 100 101 110 111
1 001 000 011 010 101 100 111 110
2 011 010 001 000 111 110 101 100
3 010 011 000 001 110 111 100 101
4 110 111 100 101 010 011 000 001
5 100 101 110 111 000 001 010 011
6 000 001 010 011 100 101 110 111
Tabela 8.7 - Codificação de código Gray
Assim, para caracterizar inequivocamente um código Gray, além do comprimento e da
seqüência de formação, também deve-se indicar a codificação inicial. Uma lista de alguns
códigos possíveis é fornecida abaixo:
• para dois bits: Comprimento 4 (1,2,1,2)
• para três bits: Comprimento 6 (1,2,1,3,2,3)
Comprimento 6 (1,2,3,1,2,3)
Comprimento 8 (1,2,1,3,1,2,1,3)
• para quatro bits: Comprimento 8 (1,2,3,4,1,4,3,2)
Comprimento 10 (1,2,1,3,4,3,1,2,1,4)
Comprimento 10 (1,2,1,3,4,1,2,1,3,4)
Um código Gray de 5 bits de comprimento 10, comumente utilizado em operações de
contagem, é o “código caminhante” (do inglês “walking code” ou “creeping code”):
Dígito Código
0 00000
1 00001
2 00011
3 00111
4 01111
5 11111
6 11110
7 11100
8 11000
9 10000
Tabela 8.8 - Código Gray de 5 bits
A razão para o uso deste código está na sua facilidade de implementação. Para avançar o
contador de uma unidade, basta mover todos os bits para a esquerda, inverter o bit mais
significativo e colocá-lo na posição mais à direita (bit menos significativo).
8.7 Códigos de detecção e correção de erros
Quando informação é transferida de uma seção para outra do computador, ou mesmo entre
dois computadores, não é incomum a ocorrência de erros, sejam eles devidos a ruídos
eletromagnéticos ou ao mau funcionamento de um componente. Se uma codificação binária
de ‘n’ bits utiliza todas as combinações possíveis (2n), então erros não podem ser nem
detectados nem corrigidos. Como todas as combinações são válidas, não existem
combinações inválidas. Um erro sempre irá transformar uma codificação válida em outra
codificação também válida.
Para ser possível a detecção de erros, e até mesmo sua correção, deve-se introduzir
redundância na codificação, seja na forma de bits extras ou do uso de combinações inválidas.
8-9
Três técnicas principais serão analisadas nas seções seguintes: códigos m-de-n, códigos com
paridade e códigos de Hamming. Todos estes códigos utilizam o mesmo comprimento em
bits para sua codificação. Existem códigos de comprimento variável, em que os símbolos
mais freqüentes utilizam menos bits que os símbolos menos freqüentes. Assim, por
exemplo, a codificação da letra “e” utilizaria muito menos bits que a letra “q”. Estes códigos,
como por exemplo código Morse, código de Shannon-Fano, código de Huffman, não serão
analisados aqui.
8.8 Códigos m-de-n
Os códigos m-de-n são compostos de tal forma que os ‘n’ bits de uma palavra binária são
formados por ‘m’ “uns” e ‘n-m’ “zeros”. Com esta limitação, de 2n combinações binárias
possíveis somente (n/m) combinações, ou seja, n!/m!(n-m)!. Este número de combinações é
maximizado quando m=n/2 (ou m=n/2 ± 1/2, se n for ímpar).
No código 2-de-5, onde palavras de 5 bits apresentam sempre 2 bits em ‘1’, tem-se então
exatamente 5!/2!(5-2)! = 5!/2!3! = 5.4/1.2 = 10 combinações válidas. Este código já foi
analisado na seção 7.3 (códigos de cinco bits ponderados, com pesos 74210). Outra
codificação possível é a 2-de-7, o código biquinário. Este código já foi analisado na seção
8.5 (códigos de sete bits ponderados, com pesos 5043210).
8.9 Códigos de paridade
Nestes códigos é adicionado um bit à palavra codificada, de tal forma que o número de “uns”
seja par (paridade par) ou ímpar (paridade ímpar). A tabela a seguir ilustra o uso de bits de
paridade par e ímpar para um código de três bits.
Código Paridade par Soma dos ‘1’ Paridade ímpar Soma dos ‘1’
000 0 0 1 1
001 1 2 0 1
010 1 2 0 1
011 0 2 1 3
100 1 2 0 1
101 0 2 1 3
110 0 2 1 3
111 1 4 0 3
Tabela 8.9 - Códigos de paridade
Se o código utilizado for de paridade par, todas as palavras com um número ímpar de “uns”
podem ser rejeitadas e sinalizadas como errôneas. Se o código for de paridade ímpar,
qualquer palavra com um número par de “uns” estará errada.
Assim, pode-se detectar qualquer erro simples (inversão de um bit). Mas não existe neste
código a capacidade de detectar dois ou mais erros (como por exemplo um erro que
transforme o código 011001 em 101001 – o número de uns permanece ímpar, mas a palavra
foi alterada). Também não existe a capacidade de corrigir o bit errôneo.
8.10 Códigos de Hamming
Os códigos de Hamming, desenvolvidos por R.W. Hamming, introduzem vários bits de
paridade, que possibilitam não só a detecção de erros mas também a sua correção. Um
conceito importante para tal é a “distância de Hamming”, ou seja, o número de bits que são
alterados entre dois códigos adjacentes.
8-10
Por exemplo, se estes dois códigos são 0001 e 0100, sua distância é de 2; entre os códigos
0000 e 1111 a distância é de 4. Se a distância de Hamming for de 1, como por exemplo em
000, 100, 101, 001, 011, 111, 110 e 010, não é possível nem a detecção nem a correção de
erros; cada erro transforma um código válido em outro também válido. Se a distância for de
2, como por exemplo em 000, 011, 110 e 101, então é possível detectar-se um erro, mas que
não pode ser corrigido (por exemplo, 001 poderia ter sido originado tanto de 000 como de
101 ou 011). Se a distância for de 3, como por exemplo em 011 e 100, então um erro
simples pode ser detectado e corrigido (por exemplo, 000 só poderia ter sido originado de
100), e um erro duplo pode ser detectado.
O código de Hamming corrige um erro alterando a palavraerrada para o código válido mais
próximo (de menor distância), desde que esta menor distância seja inequívoca, isto é, não
existam duas ou mais palavras corretas à igual distância da palavra errada.
Para possibilitar a correção de um erro simples, o código de Hamming mostrado na tabela a
seguir utiliza três bits adicionais de paridade (A, B e C) para os quatro bits de código
(ponderados por 8, 4, 2 e 1).
Posição 1 2 3 4 5 6 7
Código A B 8 C 4 2 1
0 0 0 0 0 0 0 0
1 1 1 0 1 0 0 1
2 0 1 0 1 0 1 0
3 1 0 0 0 0 1 1
4 1 0 0 1 1 0 0
5 0 1 0 0 1 0 1
6 1 1 0 0 1 1 0
7 0 0 0 1 1 1 1
8 1 1 1 0 0 0 0
9 0 0 1 1 0 0 1
10 1 0 1 1 0 1 0
11 0 1 1 0 0 1 1
12 0 1 1 1 1 0 0
13 1 0 1 0 1 0 1
14 0 0 1 0 1 1 0
15 1 1 1 1 1 1 1
Tabela 8.10 - Código de Hamming
Neste caso, o bit ‘A’ é usado para calcular a paridade par das posições 1, 3, 5 e 7. O bit ‘B’
é usado para obter-se paridade par nas posições 2, 3, 6 e 7 enquanto que ‘C’ realiza a
paridade par para as posições 4, 5, 6 e 7.
Existindo um erro, a posição do bit em erro é calculada por ‘cba’, onde ‘c’, ‘b’ e ‘a’ serão
zeros se a paridade calculada por ‘C’, ‘B’ e ‘A’ for par ou “uns” se a paridade for ímpar. Por
exemplo, se o número seis (1100110) for recebido erroneamente como 1100010, tem-se:
• verificação das posições 4, 5, 6 e 7: paridade ímpar: c = 1
• verificação das posições 2, 3, 6 e 7: paridade par: b = 0
• verificação das posições 1, 3, 5 e 7: paridade ímpar: a = 1
Assim, ‘cba’ = 101, ou seja, a posição 5 está errada e seu bit deve ser invertido para ser
corrigido. Se o número tivesse sido recebido correto, a combinação dos bits de paridade
seria zero (000).
Esta codificação pode ser estendida para qualquer número ‘n’ de bits de informação, desde
que ‘k’ bits de paridade sejam adicionados de acordo com a fórmula 2k ‡ n + k + 1. A tabela
a seguir ilustra alguns casos.
8-11
Bits de informação Bits de paridade
4 3
5 4
11 4
12 5
26 5
27 6
57 6
Tabela 8.11 - Bits de paridade no código de Hamming
8.11 Códigos alfabéticos (ou códigos alfanuméricos)
Os computadores devem manipular não somente informação numérica, mas também
informação alfabética, constituída de caracteres, sinais de pontuação e dígitos numéricos. Os
códigos que permitem este tipo de representação são denominados de códigos alfanuméricos.
Os primeiros códigos desenvolvidos utilizavam 6 bits, o que possibilitava a representação de
todos as letras maiúsculas (26), os dígitos decimais (10) e mais uma série de caracteres
especiais (ponto, vírgula, dois pontos, etc). Um destes códigos é o Hollerith, utilizado pela
IBM em cartões perfurados. Note-se que não havia a previsão para letras minúsculas.
Rapidamente os códigos foram estendidos para sete bits (inclusão das letras minúsculas) e
posteriormente para oito bits. Os dois códigos mais amplamente utilizados são o ASCII
(American Standard Code for Information Interchange) e o EBCDIC (Extended Binary
Coded Decimal Interchange Code). As letras são codificadas de tal forma a facilitarem a
ordenação alfabética de informação textual através da simples ordenação binária crescente.
O código ASCII de sete bits (com 128 combinações possíveis) é mostrado na Tabela 8.12.
Os códigos de 0 a 31 são reservados para caracteres de controle, como por exemplo
tabulação (ht), retorno de carro (cr), ejeção de página (ff), aviso sonoro (bel), retrocesso
(bsp), avanço de linha (lf), tabulação vertical (vt), escape (esc) e outros. Os caracteres
visíveis vão do código 32 (espaço em branco) até o 126 (caracter til). Note-se que dígitos e
letras estão em ordem numérica crescente (mas não contínua entre si), que não existe
codificação de nenhum caracter acentuado, e que letras maiúsculas e minúsculas possuem
uma diferença numérica de 32.
Bits Bits superiores (mais significativos)
inferiores 000 001 010 011 100 101 110 111
0000 null dle 0 @ P ` p
0001 soh dc1 ! 1 A Q a q
0010 stx dc2 " 2 B R b r
0011 etx dc3 # 3 C S c s
0100 eot dc4 $ 4 D T d t
0101 enq nak % 5 E U e u
0110 ack syn & 6 F V f v
0111 bell etb ' 7 G W g w
1000 bsp can ( 8 H X h x
1001 ht em ) 9 I Y i y
1010 lf sub * : J Z j z
1011 vt esc + ; K [ k {
1100 ff fs , < L \ l |
1101 cr gs – = M ] m }
1110 so rs . > N ^ n ~
1111 si us / ? O _ o del
Tabela 8.12 - Código ASCII de 7 bits
8-12
O código ASCII foi posteriormente estendido para oito bits, com a incorporação de mais 128
combinações à tabela acima. Com isto pode-se representar caracteres acentuados (á, à, â, ä,
ã, å, ñ, ç, etc) e diversos símbolos específicos de diversas línguas. Não existe, entretanto,
uma definição única para esta tabela ASCII de 8 bits; cada fabricante desenvolveu a sua
própria.
Atualmente oito bits já se tornaram insuficientes para representar todos os símbolos
utilizados. Não há espaço disponível, por exemplo, para codificação do alfabeto grego, árabe
ou cirílico (para não mencionar os alfabetos hindus, japoneses e chineses). Para solucionar o
problema, estuda-se atualmente um código de 16 bits, que possibilitaria representar 65536
símbolos distintos (Unicode).

Mais conteúdos dessa disciplina