Codifica dell`Informazione - Dipartimento di Matematica e Informatica

Codifica dell'Informazione
Sommario
Codifica dell'Informazione
Sommario
Codifica di dati con un alfabeto finito
Codifica binaria
Rappresentazione di dati alfanumerici
Notazione posizionale
Conversioni di base
Aritmetica in base 2, 8, 16
Rappresentazione dei numeri
Rappresentazione di un testo
Compressione dati
« Precedente Indice Successivo »
Iniziamo con una premessa di carattere matematico combinatorio. Le ragioni per le quali ci interessa l'argomento
saranno chiare nel paragrafo successivo ("Rappresentazione delle informazioni con alfabeto binario")
Codifica di dati con un alfabeto finito
Sia A = { a1, … , ak } un insieme (alfabeto) di k simboli, chiamati lettere.
D1. Quante sono le sequenze composte da n lettere (anche ripetute) di A ?
n = 1: le sequenze sono k : a1, … , ak
n = 2: le sequenze sono k2 : a1a1 , a1a2 , … , a1ak , a2a1, … , a2ak, a3a1,... , aka1, … , akak
...
Per un numero n generico, le sequenze sono kn.
Le sequenze di n lettere sono anche dette parole di lunghezza n.
D2. Quante lettere servono per rappresentare M oggetti?
Le parole (su un alfabeto di k simboli) di lunghezza n sono kn e possono rappresentare altrettanti oggetti.
L’associazione tra l'oggetto e la parola prende il nome di codifica.
Dunque per codificare M oggetti bisogna scegliere n tale che
kn ≥ M .
Se kn > M alcune sequenze non sono utilizzate.
Ad esempio, se k = 2 e M = 57 allora n ≥ 6 perché
26 = 64 > 57 ≥ 32 = 25 .
Il valore minimo di n necessario per rappresentare M oggetti (con k lettere) è il più piccolo intero maggiore o uguale
a logk M (logaritmo in base k di M).
D3. Quante cifre binarie (0/1) servono per distinguere un oggetto tra M altri?
Ne servono log2M, in base alla formula precedente. Tuttavia ci possiamo arrivare anche seguendo un procedimento
concettuale:
Divido gli oggetti in due classi, ed assegno a ciascuna una cifra 1 o 0.
Continuo ricorsivamente all’interno di ciascuna classe, fino a che tutte le classi contengono un solo elemento.
L'oggetto contenuto nella classe singola viene associato alla sequenza di cifre binarie ottenuta ripercorrendo il
processo fino alla prima suddivisione.
Graficamente il procedimento può essere illustrato dal disegno:
In informatica una struttura come quella del disegno prende il nome di albero.
Gli oggetti da codificare possono essere qualunque cosa, anche simboli di un altro alfabeto, diverso da A.
Codifica binaria
Digitalizzare: rappresentare l’informazione per mezzo di cifre (digits), per estensione numeri o meglio ancora simboli.
Quali simboli? Dal punto di vista logico ogni simbolo va bene. Ma nel mondo fisico la forma di informazione
fondamentale è la presenza/assenza di un fenomeno fisico (carica elettrica, luce, magnetismo, etc…)
Non ha importanza l’entità del fenomeno (es. quanta luce) ma solo la sua presenza o assenza -- e che possa essere
rilevata in modo affidabile. Non esiste una gradazione di valori.
La rappresentazione con due soli simboli (presenza/assenza) è un sistema binario (a due valori 0/1). L’unità base è il
bit (binary digit). Si rappresenta facilmente nei circuiti elettronici digitali come un potenziale elettrico.
Con un bit possiamo rappresentare solo ciò che può assumere due valori: e se una informazione ha bisogno di più
simboli per essere rappresentata (codificata)? I valori di un insieme X di dati saranno rappresentati da altrettante
sequenze binarie di lunghezza opportuna.
Codifica dei dati in un calcolatore.
Le memorie (realizzate con qualsiasi tecnologia) di un calcolatore sono composte da unità di memorizzazione in grado
di ricordare due valori distinti, che rappresentiamo con le cifre binarie 0 e 1.
Per poter memorizzare più di due valori dovremo usare più unità di memorizzazione: ad es., con due unità si possono
rappresentare quattro valori distinti, rappresentati dalle coppie 00, 01, 10, 11 dove la prima cifra binaria rappresenta il
valore della prima unità di memorizzazione, mentre la seconda cifra rappresenta il valore della seconda unità.
Sequenze binarie
Le possibili sequenze di n bit sono 2n , perché A = {0, 1} , ovvero A è un alfabeto di due simboli.
Un byte è una sequenza di otto bit.
Esistono 28 = 256 byte distinti.
Di solito, per comodità, la lunghezza delle sequenze binarie si misura in byte anziché in bit.
Poiché tutti i dati e le informazioni sono rappresentate come sequenze binarie, le loro dimensioni sono espresse in bit
e/o byte.
Unità di misura della lunghezza di sequenze binarie
1 KB = 1 kilobyte = 1024 byte = 210 byte = 210.23 bit = 213 bit , ( circa 1000 byte)
1 MB = 1 megabyte = 220 byte = 223 bit , (circa 1 milione di byte)
1 GB = 1 gigabyte = 230 byte = 233 bit, (circa 1miliardo di byte)
1 TB = 1 terabyte = 240 byte , (circa 1000 miliardi di byte)
Rappresentazione di dati alfanumerici
Vediamo ora come si rappresentano numeri e testi nella memoria di un calcolatore.
Notazione posizionale
Rappresentiamo un numero naturale usando dieci simboli, detti cifre decimali:
“0”, “1”, “2”, “3”, “4”, “5”, “6”, “7”, “8”, “9”
scritti in sequenza: e. g., la sequenza
2047
rappresenta il numero “duemilaquarantasette”
L’aggettivo “posizionale” sta a indicare il fatto che una cifra più a sinistra di un’altra ha una importanza/peso
maggiore: nella sequenza
2047 = 2⋅103 + 0⋅102 + 4⋅101 + 7⋅100
la cifra 2 indica “due migliaia”, la cifra 4 indica “quattro decine”.
Cifra più significativa: cifra più a sinistra.
Cifra meno significativa: cifra più a destra.
La notazione posizionale si può applicare ad un alfabeto di B simboli, dove B ≥ 2 è detto la base della
rappresentazione. La sequenza di n cifre
bn-1bn-2 … b1b0
rappresenta il numero
bn-1⋅Bn-1 + bn-2⋅Bn-2 … + b1⋅B1 + b0⋅B0
dove bi < B, per ogni i < n.
Tale rappresentazione è unica: ogni numero è rappresentato da una sola sequenza di cifre.
Esempi: base 2, 8, 16
Per rappresentare numeri usando basi diverse, si aggiunge un pedice (che indica la base) accanto alla cifra meno
significativa. Per esempio:
11012 = 1310 .
Quando la base non è indicata, intenderemo la base 10.
Base 2 (binaria), cifre 0, 1:
11012 = 1⋅23 + 1⋅22 + 0⋅21 + 1⋅20 = 8 + 4 + 1 = 13
Base 8 (ottale), cifre 0, 1, 2, 3, 4, 5, 6, 7:
13678 = 1⋅83 + 3⋅82 + 6⋅81 + 7⋅80 = 51210 + 19210 + 4810 + 7 = 75910
Base 16 (esadecimale), cifre 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F (le lettere corrispondono ai numeri 10, 11, 12,
13, 14, 15)
FA116 = 15⋅162 + 10⋅161 + 1⋅160 = 384010 + 16010 + 1 = 400110
Conversioni di base
Da una base B alla base 10
Già visto.
Dalla base 10 a una base B
Algoritmo di conversione per divisioni successive:
N = N1⋅B+b0 (N1 quoziente, b0 resto della divisione di N per B)
= (N2⋅B+b1)⋅B+b0 = N2⋅B2+b1⋅B+b0 (N2 quoziente, b1 resto della divisione di N1 per B)
...
= bn-1⋅Bn-1 + bn-2⋅Bn-2 … + b1⋅B1 + b0⋅B0
Ecco alcuni esempi di conversione:
124
62
0
31
0
15
1
7
1
3
1
1
1
0
1
12410 = 11111002
759
94
7
11
6
1
3
0
1
75910 = 13678
4001
250
1
15
A
0
F
400110 = FA116
Conversione tra le basi 2, 8, 16
Il procedimento di conversione di un numero N dalla base 2 ad una base 2n è più semplice. Non si eseguono divisioni,
ma, a partire da destra, si raggruppano i bit di N a gruppi di n e si converte ciascun gruppo in una cifra della base 2n.
11111002 = 01112⋅16 + 11002 = 7⋅16 + 12 = 7C16
10111101112 = 1⋅83 + 011⋅82 + 110⋅81 + 111⋅80
= 1⋅83 + 3⋅82 + 6⋅81 + 7⋅80 = 13678
Il procedimento di conversione di un numero N dalla base 2n alla base 2 si ottiene convertendo ogni cifra in base 2n in
una sequenza di n bit:
FA116 = 15⋅162 + 10⋅16 + 1⋅160
= 11112 ⋅ 162 + 10102⋅16 + 00012⋅160
= 1111101000012
Aritmetica in base 2, 8, 16
Per le sottrazioni si considerano i prestiti (borrow) invece dei riporti (carry); per eseguire delle moltiplicazioni bisogna
conoscere le tabelline della base prescelta.
La moltiplicazione e la divisione di un numero binario per 2 (vale in generale con B) si ottiene facendo scorrere (shift)
a sinistra o a destra di una posizione il numero stesso. Nello scorrimento a sinistra entrano zeri a destra e la lunghezza
aumenta di 1, nello scorrimento a destra si perde la cifra meno significativa e la rappresentazione si accorcia di 1.
Nota: con la rappresentazione binaria (solamente) si possono compiere non solo operazioni aritmetiche ma anche
operazioni logiche, secondo l'associazione naturale 1=Vero 0=Falso. Vedremo nelle lezioni successive di che cosa si
tratta.
Indovinello
Perché i programmatori americani confondono Natale con Halloween? Risposta: perché 25 DEC = 31 OCT
Suggerimento: considerate 2510 e 318
Rappresentazione dei numeri
Rappresentazione dei numeri naturali
I numeri naturali sono gli interi senza segno. Si usa la rappresentazione binaria usando un numero fissato n di bit (di
solito n = 8, 16, 32, 64)
Così si rappresentano i numeri da 0 a 2n - 1 .
Se un’operazione aritmetica genera un valore maggiore di 2n - 1, si verifica un errore di supero (overflow), perché il
numero ottenuto è troppo grande per essere rappresentato con n bit.
Se n = 4 allora la somma 1011+0111 =10010 genera un errore di overflow.
Rappresentazione dei numeri interi
Come per i numeri naturali, si usa la notazione binaria con n bit (n = 8, 16, 32) .
Una metà delle sequenze di n bit rappresenta numeri negativi, mentre l’altra numeri maggiori o uguali a zero.
Il segno è determinato dal bit più significativo (bit di segno): 1 per valori negativi, 0 per valori positivi o zero.
Esistono diverse rappresentazioni, e. g.:
rappresentazione con modulo e segno
complemento a 1,
complemento a 2
Come nel caso dei numeri naturali si rappresenta un insieme finito di valori, per cui è possibile il manifestarsi di errori
di overflow e underflow (il valore ottenuto è inferiore al valore minimo rappresentabile.
Rappresentazione con modulo e segno:
Con n bit si rappresentano i numeri interi da -(2n-1 - 1) a 2n-1 – 1.
Il bit più significativo indica il segno: 0 = positivo, 1 = negativo, gli altri bit rappresentano il modulo (valore assoluto).
Ad es., con n=3 si rappresentano i numeri da -3 a 3
000 = 0, 001 = 1, 010 = 2, 011 = 3,
100 = 0, 101 = -1, 110 = -2, 111 = -3
Difetti: due rappresentazioni dello zero, il calcolo di operazioni aritmetiche deve tenere conto dei segni (macchinoso):
nella pratica si usa il complemento a 2.
Rappresentazione di numeri reali
In realtà si rappresenta un insieme finito di numeri razionali, rappresentabili con un numero finito di cifre:
rappresentazione in virgola fissa, ad es. 0.019
rappresentazione in virgola mobile (floating point), detta anche rappresentazione con mantissa ed esponente,
ad es. 0.019 = 19.10-3 dove 19 è la mantissa, -3 è l’esponente
In virgola mobile si possono rappresentare numeri molto grandi o molto piccoli, come il numero di Avogadro
6.022⋅1023 o la massa di un elettrone: 9.10956⋅10-28 g
La mantissa solitamente è normalizzata, in modo da rappresentare un numero tra 0 e 1, quindi in effetti basta
rappresentare la sola parte frazionaria (lo zero prima della virgola rimane implicito).
Rappresentazione floating point nei calcolatori
Si usa la base 2. L'esponente e la mantissa sono numeri interi (quindi con segno).
Per esempio, con 32 bit a disposizione potremmo usare:
2 bit per i segni di mantissa ed esponente,
20 bit per il modulo della mantissa,
10 bit per il modulo dell’esponente.
Lo standard ANSI/IEEE prevede invece la seguente rappresentazione per i floating point a precisione singola (32 bit):
1 bit di segno della mantissa
8 bit per l'esponente
23 bit per la mantissa
L'esponente viene rappresentato in "eccesso 127" ovvero bisogna sottrarre 127 al valore naturale codificato in 8 bit per
ottenere l'intero tra -126 e 127 rappresentato (il -127 ed il 128 sono riservati per codificare valori speciali).
La mantissa codifica la parte frazionaria di un numero binario che ha un 1 prima della virgola. Ogni numero binario
può essere ricondotto a tale forma per divisioni o moltiplicazioni successive per 2.
Quindi, se è il segno, E è il numero naturale codificato in binario dall'esponente ed M è il numero naturale codificato
in binario dalla mantissa, il valore del numero rappresentato è:
(-1)s ⋅ [1,M] ⋅2(E-127)
Rappresentazione di un testo
Un testo è una sequenza di caratteri: lettere dell’alfabeto maiuscole e minuscole, cifre decimali, segni di punteggiatura,
caratteri speciali come indicatori di fine riga o pagina, etc..
Si codifica ogni simbolo con un numero. Esistono diversi insiemi di simboli ASCII, UNICODE, EBCDIC e relative
codifiche, che associano ad ogni simbolo un codice numerico.
ASCII (American Standard Code for Information Interchange), usa 7 bit (inclusi in un byte con il bit più significativo
a 0) per codificare un carattere.
ASCII esteso (ad es. ISO/IEC 8859-1): 256 simboli, codifica anche simboli speciali (è, à, ü, ...) quando il bit più
significativo è 1.
UNICODE: circa 107000 caratteri, tutti gli alfabeti. Si codifica in vari modi, la codifica più comune è UTF-8, che
estende la codifica ASCII ed è a lunghezza variabile, da 1 a 4 byte per simbolo.
Ad esempio, Il testo:
~mazzanti
ha la seguente codifica ASCII a 7 bit (in decimale e in binario):
~
m
a
z
z
a
n
t
i
126
109
97
122
122
97
110
116
105
01111110
01101101
01100001
01111010
01111010
01100001
01101110
01110100
01101001
in ogni colonna della tabella è indicato un carattere di testo, la sua codifica ASCII in notazione decimale e in notazione
binaria. La rappresentazione in memoria sarà pertanto
011111100110110101100001011110100111101001100001011011100111010001101001
che si ottiene concatenando i byte della terza riga della tabella.
Tabella codici ASCII
Compressione dati
Nel codificare l'informazione si vorrebbe anche cercare di impiegare meno bit possibile per economizzare sullo spazio
occupato.
Finora abbiamo associato una sequenza di bit di uguale lunghezza a ciascun simbolo. Tuttavia, se non tutti i simboli
sono ugualmente frequenti (p. es. alfabeto) potremmo risparmiare spazio assegnando sequenze più corte a simboli
più frequenti.
L'alfabeto Morse sfrutta questo principio: la lettera "E", molto frequente nell'inglese è associata al singolo punto,
mentre lettere meno frequenti come la "Z" hanno un codice di 4 "bit".
Letter
Code
Letter
Code
A
*-
N
-*
B
-***
O
---
C
-*-*
P
*--*
D
-**
Q
--*-
E
*
R
*-*
F
**-*
S
***
G
--*
T
-
H
****
U
**-
I
**
V
***-
J
*---
W
*--
K
-*-
X
-**-
L
*-**
Y
-*--
M
--
Z
--**
La formalizzazione di questa idea prende il nome di codifica di Huffman, e si basa sulla statistica delle occorrenze dei
simboli.
La compressione serve ad occupare meno spazio nella memoria di massa o a ridurre il tempo di trasmissione. Alle
volte invece si vuole aumentare ad arte la lunghezza della codifica per introdurre ridondanza, che serve a tollerare
possibili errori di lettura o trasmissione.
Per esempio, la compitazione con parole al posto delle lettere (che si usa p. es. al telefono) è una tecnica che aumenta
la lunghezza del messaggio ma -- introducendo ridondanza -- lo rende più robusto ai disturbi sulla linea. In campo
militare, nelle comunicazioni radio, si usa l'alfabeto NATO (Alfa, Bravo, Charlie, etc....).
Un esempio concreto legato alla codifica binaria è il bit di parità: consideriamo gruppi di 7 bit (p. es.) ed
aggiungiamo un ottavo bit che vale 0 se il numero di "1" nella parola è pari, e vale 1 altrimenti. Se un disturbo altera
un bit del messaggio ce ne possiamo accorgere controllando la parità (ma se cambiano 2 bit non ce ne accorgiamo!).
Abbiamo trattato la rappresentazione di dati alfanumerici. In una lezione successiva tratteremo la rappresentazione di
dati multimediali (immagini, suoni, video).
« Precedente Indice Successivo »
[Rielaborazione a cura di A. Fusiello degli appunti di S. Mazzanti]