Um caractere ASCII estendido é representado por uma quantidade de 8 bits. A codificação de Hamming associada a cada caractere pode então ser representada por uma sequência de três dígitos hexa. Codifique o seguinte texto ASCII estendido de cinco caracteres usando um código de Hamming com paridade par: Earth. Mostre sua resposta como uma sequência de dígitos hexa.
Passo 1
O que o problema pede e os dados que temos.
- O texto a codificar é: “Earth” (cinco caracteres).
- Cada caractere é um byte de 8 bits (ASCII estendido). Vou usar os códigos ASCII padrão para essas letras (esses valores estão todos dentro de 0–127, então não há ambiguidade):
-
tem código que em binário de 8 bits é . -
tem código que em binário de 8 bits é . -
tem código que em binário de 8 bits é . -
tem código que em binário de 8 bits é . -
tem código que em binário de 8 bits é .
-
O que devemos devolver: a codificação de Hamming (paridade par) associada a cada caractere, representada por uma sequência de três dígitos hex cada (ou seja, 12 bits por caractere). A resposta final deve ser uma sequência hexa para os cinco caracteres.
Passo 2
Explicação didática do código de Hamming que vamos usar (passo-a-passo, sem pular etapas).
- Para codificar 8 bits de dados com Hamming usando 4 bits de paridade obtemos um código de
bits: é o Hamming . - Convenção de posicionamento (essa convenção é a mais usada e a que vou seguir):
- Numero as posições de bits de
a , com sendo o bit menos significativo (LSB, à direita) e o bit mais significativo (MSB, à esquerda). Esta numeração (direita → esquerda) facilita a definição dos conjuntos de paridade. - Os bits de paridade ficam nas posições que são potências de dois:
. Chamo-os (posição 1), (posição 2), (posição 4) e (posição 8). - Os 8 bits de dado (do byte) chamam-se
. Vou mapear para o bit menos significativo do byte (LSB) e para o bit mais significativo (MSB) do byte. Ou seja, corresponde ao bit do byte, onde é o LSB. - Os dados
são colocados nas posições restantes, na ordem crescente de posição: posições .
- Numero as posições de bits de
- Como calcular cada bit de paridade (paridade par):
- O bit de paridade na posição
cobre todas as posições (incluindo a própria ) cujo índice em binário tem o bit (contando do LSB) igual a . - Para obter paridade par, o valor do bit de paridade é escolhido de modo que a soma (em
) de todos os bits cobertos (incluindo o próprio bit de paridade) seja (ou seja, número total de 1’s par). Em prática, calcula-se a soma XOR dos bits de dados cobertos e define-se o bit de paridade para tornar a soma total par.
- O bit de paridade na posição
Resumo prático (conjuntos):
-
(posição ) cobre posições . -
(posição ) cobre posições . -
(posição ) cobre posições . -
(posição ) cobre posições .
Depois de calcular os
, teremos um vetor de 12 bits nas posições
. Para escrever em hexadecimal, agrupo esses 12 bits em 3 grupos de 4 bits, do MSB (posição 12) para o LSB (posição 1), e converto cada grupo para um dígito hexa.
Passo 3
Codificação do caractere
(detalhado passo-a-passo).
- Byte ASCII de
: . Em binário 8 bits: Vou listar os bits do byte como .
Portanto: - Colocando nos lugares do código (posições 1…12, com ? para paridade ainda desconhecida):
Substituindo os : Ou seja, inicialmente: - Calcular paridades (paridade par):
- Para
(posições ): bits conhecidos são . Soma de uns = (par). Então para manter paridade par. - Para
(posições ): . Soma = (ímpar). Então . - Para
(posições ): . Soma = (ímpar). Então . - Para
(posições ): . Soma = (ímpar). Então .
- Para
- Agora o vetor de 12 bits (posição 12 → 1) é:
Agrupando em 3 nibbles (4 bits) do MSB para LSB: Esses nibbles em hexa são . Logo o código de Hamming de é .
Passo 4
Codificação do caractere
.
- Byte ASCII
: . Em binário: Bits: .
Assim: - Posicionando nos 12 bits (com paridades ?):
Mais claramente: - Calcular paridades:
-
cobre : (par) → . -
cobre : (ímpar) → . -
cobre : (par) → . -
cobre : (par) → .
-
- Vetor 12 bits pos 12→1:
Nibbles: → hex . Código: .
Passo 5
Codificação do caractere
.
- Byte
: . Binário: Bits: . - Posicionando:
- Paridades:
-
(1,3,5,7,9,11): (ímpar) → . -
(2,3,6,7,10,11): (par) → . -
(4,5,6,7,12): (par) → — atenção: aqui o bit na posição 4 era paridade que ajustamos para tornar o total par; calculando sem o próprio deu soma ímpar, então escolhemos . (Explicando: os bits conhecidos que cobre exceto ele mesmo foram somando 1; portanto tem que ser 1.) -
(8,9,10,11,12): (ímpar) → .
-
- Vetor pos 12→1:
Nibbles: → hex . Código: .
Passo 6
Codificação do caractere
.
- Byte
: . Binário: Bits . - Posicionando:
- Paridades:
-
(1,3,5,7,9,11): (par) → . -
(2,3,6,7,10,11): (ímpar) → . -
(4,5,6,7,12): (ímpar) → . -
(8,9,10,11,12): (ímpar) → .
-
- Vetor pos 12→1:
Nibbles: → hex . Código: .
Passo 7
Codificação do caractere
.
- Byte
: . Binário: Bits . - Posicionando:
- Paridades:
-
(1,3,5,7,9,11): (par) → . -
(2,3,6,7,10,11): (ímpar) → . -
(4,5,6,7,12): (ímpar) → . -
(8,9,10,11,12): (ímpar) → — cuidado: a soma dos dados cobertos por (excluindo ) foi somando que é par, então = 0. (Rechecagem: 0+1+1+0=2 → par → p8=0.)
-
- Vetor pos 12→1:
Nibbles: → hex . Código: .