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]