Salta al contenuto
Note per Studenti Codici binari - BCD, ASCII, Unicode, parità e Gray

Codici binari - BCD, ASCII, Unicode, parità e Gray

In questa pagina 7

Una codifica associa a ogni elemento di un insieme discreto una configurazione di bit, per facilitare elaborazione, memorizzazione e trasmissione. Un codice a nn bit ha 2n2^n configurazioni: 4 elementi si codificano con 2 bit (00, 01, 10, 11), 8 elementi con 3 bit, 16 con 4 bit. Se gli elementi sono meno delle configurazioni, alcune configurazioni restano non utilizzate.

Codice BCD

Il BCD (Binary-Coded Decimal) codifica ogni cifra decimale con il suo valore binario su 4 bit. Per scrivere un numero si codifica cifra per cifra:

cifra 0 1 2 3 4 5 6 7 8 9
BCD 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001

Esempio. 18510=0001  1000  0101BCD185_{10}=0001\;1000\;0101_{BCD}, mentre in binario puro è 10111001210111001_2: le due rappresentazioni sono diverse. Invece 310=0011BCD=1123_{10}=0011_{BCD}=11_2 coincidono solo perché il numero ha una cifra.

Le sei configurazioni 1010,1011,1100,1101,1110,11111010,1011,1100,1101,1110,1111 (valori 1010–1515) non sono cifre BCD: sono un esempio di configurazioni non utilizzate, che nelle mappe di Karnaugh diventano condizioni di indifferenza (Mappe di Karnaugh - POS, condizioni di don't care e paritàPer la POS minima si raggruppano gli 0 della mappa, si ottiene la SOP minima di $\overline F$ e si scrive $F$ come prodotto di somme (variabile diretta se vale 0 nel gruppo, negata se vale 1). Le condizioni di don't care (X) sono combinazioni di ingresso che non si presentano o la cui uscita è indifferente: si usano come 1 o come 0 a seconda di quel che allarga i gruppi (mai raggruppamenti fatti solo di X). Le funzioni XOR a più variabili (disparità) e XNOR (parità) hanno mappa a scacchiera: non si semplificano con i gruppi.Mappe di Karnaugh - POS, condizioni di don't care e parità →).

Lo spreco di bit (4 bit per 10 valori) è il prezzo della comodità quando ingressi e uscite sono numeri decimali (display, calcolatrici). Per rappresentare il numero 1010 in BCD servono 8 bit (0001 00000001\,0000), non 4: la cifra 1010 non esiste.

Attenzione ai quiz. 0001 0101 1001BCD0001\,0101\,1001_{BCD} è 159159 (non 15191519): si legge a gruppi di 4. 00101000BCD00101000_{BCD} vale 2828, non 4040 (che sarebbe la lettura binaria 25+232^5+2^3). Il BCD 0001001000010010 è 121012_{10}, cioè C16C_{16}.

ASCII

L'ASCII (American Standard Code for Information Interchange) usa 7 bit per 128128 caratteri: lettere maiuscole e minuscole, cifre, segni di punteggiatura e 3232 caratteri di controllo non stampabili. Di solito si memorizza in un byte, con il bit più significativo a 00 o usato per caratteri aggiuntivi.

Esempi: A =10000012=65=1000001_2=65; a =11000012=97=1100001_2=97 (le minuscole differiscono dalle maiuscole per un bit); la cifra 0 =01100002=48=0110000_2=48, la cifra 5 =01101012=53=0110101_2=53.

Relazione con il BCD: il codice ASCII di una cifra decimale si ottiene aggiungendo 011 a sinistra del suo BCD: 5 =011 0101=011\,0101 (01010101 è il BCD di 5).

Unicode e UTF-8

L'ASCII non basta per le lingue del mondo. Unicode assegna a ogni carattere un numero univoco, il code point, indipendente da lingua, piattaforma e programma; si scrive U+ seguito dalle cifre esadecimali (T = U+0054, ± = U+00B1, € = U+20AC). La codifica più usata è UTF-8, che usa da 1 a 4 byte per code point ed è compatibile con l'ASCII: i primi 128128 code point hanno la stessa codifica a un byte.

intervallo del code point byte schema dei bit
U+0000 – U+007F 1 0xxxxxxx
U+0080 – U+07FF 2 110xxxxx 10xxxxxx
U+0800 – U+FFFF 3 1110xxxx 10xxxxxx 10xxxxxx
U+10000 – U+10FFFF 4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

I bit x sono quelli del code point, scritti in binario e distribuiti da sinistra a destra.

Esempio ±: B116=1011 00012B1_{16}=1011\,0001_2 sta in 22 byte. Gli 1111 bit di payload sono 000 1011 0001000\,1011\,0001: i primi 55 (0001000010) vanno nel primo byte, gli ultimi 66 (110001110001) nel secondo: 11000010  1011000111000010\;10110001. Esempio €: 20AC16=0010 0000 1010 1100220AC_{16}=0010\,0000\,1010\,1100_2, 1616 bit, quindi 33 byte: 11100010  10000010  1010110011100010\;10000010\;10101100.

UTF-8 non usa un solo byte per tutti i caratteri, né due byte per tutti quelli alfanumerici: lunghezza variabile.

Bit di parità

Per rilevare errori (non correggerli) si aggiunge un bit scelto in modo che il numero totale di 1 sia pari (parità pari, la più usata) oppure dispari.

Esempi. 1000001 ha due 1: con parità pari il bit è 00 (0100000101000001), con parità dispari è 11 (1100000111000001). 1010100 ha tre 1: parità pari →\to bit 11 (1101010011010100); parità dispari →\to bit 00 (0101010001010100).

Il ricevitore conta gli 1. Se in un sistema a parità pari arriva una parola con un numero dispari di 1, almeno un bit è stato corrotto (può rispondere con un NAK, negative acknowledge, e farsi ritrasmettere il dato). Se il numero è pari non c'è stato errore su un singolo bit, ma sono possibili due errori che si compensano: la parità rivela errori su un numero dispari di bit. Esempi con parità pari: 00100010 (due 1) e 11111111 (otto 1) sono parole accettabili, 00100011 segnalerebbe un errore. Per correggere servono più bit di controllo.

Distanza di Hamming

La distanza di Hamming tra due configurazioni è il numero di bit in cui differiscono. Esempi: 8=10008=1000 e 11=101111=1011 differiscono nei due bit meno significativi, distanza 22; 8=10008=1000 e 4=01004=0100 differiscono in due posizioni, distanza 22; 0=0000=000 e 7=1117=111, distanza 33. Non è la differenza algebrica dei numeri.

Geometricamente, le configurazioni di nn bit sono i vertici di un ipercubo (n=1n=1 segmento, n=2n=2 quadrato, n=3n=3 cubo): due configurazioni a distanza 11 sono unite da uno spigolo. Servirà nelle mappe di Karnaugh (Mappe di Karnaugh - implicanti e copertura minimaLa mappa di Karnaugh è la tabella di verità disposta in una griglia con righe e colonne in codice Gray, così che celle adiacenti (anche tra bordi opposti) differiscano in una sola variabile. Si raggruppano gli 1 in rettangoli di $2^k$ celle: ogni gruppo elimina $k$ variabili e dà un prodotto. Implicante primo = gruppo massimo; essenziale = unico a coprire un mintermine; la copertura minima contiene tutti gli essenziali più il minimo di altri primi (può non essere unica). Efficace fino a 4 variabili.Mappe di Karnaugh - implicanti e copertura minima →).

Codice Gray

Il codice Gray è un codice in cui due numeri consecutivi hanno distanza di Hamming 11: passando dal numero al successivo cambia un solo bit.

Perché serve. Un dispositivo che segnala la propria posizione con 33 interruttori B2B1B0B_2B_1B_0 in codice binario passa da 011011 (posizione 3) a 100100 (posizione 4) cambiando tutti e tre i bit. Nella realtà i sensori non cambiano nello stesso istante: durante la transizione si può leggere 011→001→101→100011\to001\to101\to100, e 101101 è la posizione 55, un grosso errore. Con il Gray la transizione fra posizioni adiacenti cambia un solo sensore: per un encoder ottico a 33 bit i sensori sul confine fra le posizioni 010010 e 110110 possono leggere solo 010010 o 110110, entrambe corrette entro la tolleranza. (Da qui l'uso nei sensori di posizione; nel corso lo si usa anche per ordinare le mappe di Karnaugh e per codificare gli stati.)

Costruzione per riflessione. Si parte dal codice a n−1n-1 bit, lo si riscrive in ordine inverso (specchiato) sotto se stesso, si antepone 00 alla prima metà e 11 alla seconda. Con 33 bit: 000,001,011,010,110,111,101,100000,001,011,010,110,111,101,100. Il primo e l'ultimo valore hanno distanza 11: il codice è chiuso (ciclico).

Conversione binario →\to Gray. Il bit più significativo si copia; ogni altro bit è lo XOR del bit binario corrispondente con quello alla sua sinistra: gi=bi⊕bi+1g_i=b_i\oplus b_{i+1}. Esempio: b=1011b=1011: g3=1g_3=1; g2=0⊕1=1g_2=0\oplus1=1; g1=1⊕0=1g_1=1\oplus0=1; g0=1⊕1=0g_0=1\oplus1=0, quindi g=1110g=1110. La conversione inversa è bi=bi+1⊕gib_i=b_{i+1}\oplus g_i.

decimale 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
binario 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
Gray 0000 0001 0011 0010 0110 0111 0101 0100 1100 1101 1111 1110 1010 1011 1001 1000

Codice Gray con un numero di parole non potenza di 2. Per nn parole pari (esempio 1010) si calcola il Gray delle prime n/2=5n/2=5 parole (0000,0001,0011,0010,01100000,0001,0011,0010,0110) e si aggiunge la loro immagine speculare con il bit più significativo a 11: 1110,1010,1011,1001,10001110,1010,1011,1001,1000. Risultato: 0000,0001,0011,0010,0110,1110,1010,1011,1001,10000000,0001,0011,0010,0110,1110,1010,1011,1001,1000, ancora chiuso (00000000 e 10001000 distano 11). Per 2n−12^n-1 parole (esempio 77) basta prendere le prime 77 del Gray normale: 000,001,011,010,110,111,101000,001,011,010,110,111,101.

Errori comuni

  • Leggere un BCD come binario (0010100000101000 non è 4040) o dimenticare che servono 4 bit per cifra.
  • Dire che la parità corregge gli errori: li rileva, e solo se sono in numero dispari.
  • Calcolare la distanza di Hamming come differenza dei numeri.
  • Confondere ASCII a 7 bit con un codice a 8 bit.
  • Pensare che UTF-8 usi sempre lo stesso numero di byte.

Versione ripasso

  • Codice a nn bit: 2n2^n configurazioni.
  • BCD: 4 bit per cifra, cifra per cifra (185=0001 1000 0101185=0001\,1000\,0101, diverso dal binario 1011100110111001); 10101010–11111111 non usati; per il numero 1010 servono 88 bit; 0001 0101 1001=1590001\,0101\,1001=159, 00101000=2800101000=28.
  • ASCII: 7 bit, 128128 caratteri; cifra ASCII =011=011 + BCD; A=1000001=1000001.
  • UTF-8: code point U+…, da 1 a 4 byte, compatibile con ASCII; ± = 11000010 10110001.
  • Parità: bit aggiunto per avere un numero pari (o dispari) di 1; rileva un numero dispari di errori; 1000001 →\to pari 01000001, dispari 11000001.
  • Distanza di Hamming: numero di bit diversi (8=10008=1000 e 11=101111=1011: 22).
  • Gray: numeri consecutivi a distanza 11 (sensori di posizione, mappe di Karnaugh); per riflessione o gi=bi⊕bi+1g_i=b_i\oplus b_{i+1} (1011→11101011\to1110); 0,1,2,3,…0,1,2,3,\dots: 000,001,011,010,110,111,101,100000,001,011,010,110,111,101,100; il codice è chiuso.
  • Errori: BCD letto come binario; parità che "corregge"; Hamming come differenza.

Esercizi su questo argomento

Teoria collegata