Daten- und Zahlendarstellung, Kompression, Fehlerkorrektur
Das Wort "Käse" erscheint auf einem anderen Rechner als "Käse". Ein Programm rechnet 0,1 + 0,2 und liefert 0,30000000000000004. Ein 8-Bit-Zähler springt von 127 auf −128. Ein Film, der unkomprimiert über 150 Megabyte je Sekunde braucht, passt auf ein Handy.
Wie stellt ein Rechner Zahlen, Zeichen, Töne und Bilder als Bitfolgen dar, wie spart er Platz, und wie merkt er, wenn ein Bit kippt? Du baust auf Binärzahlen, Pixel, Paritätsbit und Lauflängencodierung auf.
Repräsentation von Information, Binär- und Hexadezimalsystem
Information stellt ein Rechner durch Daten dar, das sind Bitfolgen mit vereinbarter Bedeutung. Dieselbe Bitfolge kann eine Zahl, ein Zeichen, eine Farbe oder einen Befehl bedeuten, je nach Codierung. Mit n Bit gibt es Bitfolgen. Lange Bitfolgen schreibt man im Hexadezimalsystem (Basis 16) mit den Ziffern 0 bis 9 und A bis F (A ist 10, F ist 15). Eine Hexadezimalstelle entspricht 4 Bit, ein Byte zwei Stellen. Beispiel: 1101 0110 sind D (13) und 6, also D6 = 13 · 16 + 6 = 214.
Zweierkomplement und Overflow
Ganze Zahlen mit Vorzeichen stellt man im Zweierkomplement dar. Bei n Bit hat das höchste Bit den Wert , die übrigen haben ihre üblichen Werte. Negative Zahlen beginnen daher mit 1. Der Bereich reicht von bis , bei 8 Bit von −128 bis 127. Eine negative Zahl bildest du aus der positiven: alle Bits umkehren, 1 addieren. So wird zu .
Liegt ein Ergebnis außerhalb des Bereichs, entsteht ein Overflow: Die Rechnung liefert ohne Warnung ein falsches Ergebnis. Bei einer Addition tritt er nur auf, wenn beide Zahlen das gleiche Vorzeichen haben und das Ergebnis das andere.
Zweierkomplement und Overflow
Zweierkomplement und Overflow
Stelle −37 mit 8 Bit dar. Was liefert 100 + 50 mit 8 Bit?
37 ist 0010 0101. Umkehren ergibt 1101 1010, plus 1 ergibt 1101 1011. Kontrolle: −128 + 64 + 16 + 8 + 2 + 1 = −37.
100 ist 0110 0100, 50 ist 0011 0010. Die Summe 1001 0110 hat den Wert −128 + 16 + 4 + 2 = −106. Die richtige Summe 150 liegt über 127: Zwei positive Zahlen ergeben ein negatives Ergebnis, ein Overflow.
Festkomma- und Gleitkommazahlen
Bei Festkommazahlen liegt das Komma an fester Stelle, etwa 4 Bit vor und 4 Bit nach dem Komma. Die Nachkommastellen haben die Werte , der Abstand benachbarter Zahlen ist konstant (), der Bereich klein.
Gleitkommazahlen speichern mit Vorzeichen v, Mantisse m und Exponent e. Nach IEEE 754 hat eine 32-Bit-Zahl 1 Vorzeichenbit, 8 Exponentenbits (gespeichert als e + 127) und 23 Mantissenbits. Die Mantisse ist als normiert, die führende 1 wird nicht gespeichert. 64 Bit (1, 11 und 52 Bit) sind genauer. Dezimalbrüche wie 0,1 haben im Zweiersystem unendlich viele Stellen und werden gerundet. Darum liefert 0,1 + 0,2 bei 64 Bit nicht genau 0,3, und man vergleicht Gleitkommazahlen nicht mit "gleich".
5,25 als 32-Bit-Gleitkommazahl
5,25 als 32-Bit-Gleitkommazahl
Stelle 5,25 nach IEEE 754 mit 32 Bit dar.
5,25 ist binär 101,01, normiert 1,0101 · 2². Vorzeichen 0, Exponent 2 + 127 = 129 = 1000 0001, Mantisse 0101 mit Nullen bis 23 Bit. In Vierergruppen: 0100 0000 1010 1000 0000 0000 0000 0000, hexadezimal 40A80000.
Zeichenkodierung und Codepages
ASCII ordnet 128 Zeichen 7-Bit-Codes zu (A hat 65), Umlaute fehlen. Mit 8 Bit gibt es 256 Plätze. Die zweite Hälfte belegte jede Codepage anders, etwa ISO 8859-1 für Westeuropa. Dieselben Bytes zeigen je nach Codepage andere Zeichen. Unicode nummeriert die Zeichen aller Schriften mit Codepunkten, etwa U+00E4 für ä. UTF-8 codiert einen Codepunkt mit 1 bis 4 Byte: ASCII-Zeichen bleiben ein Byte, ä braucht zwei, das Eurozeichen drei. Zwei Byte haben das Muster 110xxxxx 10xxxxxx. Beispiel: U+00E4 ist 000 1110 0100 mit 11 Bit, im Muster also 110 00011 und 10 100100, hexadezimal C3 A4. Liest ein Programm diese Bytes als ISO 8859-1, zeigt es à (C3) und ¤ (A4): Aus "Käse" wird "Käse".
Bilder, Töne, Filme und Digitalisierung
Digitalisieren heißt, einen stetigen Verlauf in Zahlen umzusetzen: durch Abtasten (Messen in festen Abständen) und Quantisieren (Runden auf endlich viele Stufen). Beim Bild ist das Abtasten die Zerlegung in Pixel, das Quantisieren die Farbtiefe. Beim Ton misst man mit einer Abtastrate (CD: 44 100 je Sekunde) und rundet jeden Wert auf eine Bittiefe (CD: 16 Bit) je Kanal. Das Abtasttheorem verlangt eine Abtastrate über dem Doppelten der höchsten Frequenz. Ein Film ist eine Folge von Bildern mit einer Bildrate (etwa 25 je Sekunde) und meist einer Tonspur. Eine Minute CD-Ton (44 100 Hz, 16 Bit, 2 Kanäle) hat 44 100 · 16 · 2 · 60 : 8 = 10 584 000 Byte. Unkomprimiertes Full-HD-Video (1920 mal 1080 Pixel, 24 Bit, 25 Bilder je Sekunde) braucht 155 520 000 Byte je Sekunde.
Kompression: Kompressionsrate, Huffman-Codierung und LZW
Die Kompressionsrate ist die Größe vorher geteilt durch die Größe nachher. Die Lauflängencodierung lohnt nur bei langen Läufen gleicher Zeichen.
Die Huffman-Codierung gibt häufigen Zeichen kurze, seltenen lange Codewörter. Man fasst wiederholt die zwei Knoten mit der kleinsten Häufigkeit zu einem Knoten mit der Summe zusammen, bis ein Binärbaum entsteht. Die Kante zum linken Kind bekommt 0, die zum rechten 1, der Code eines Zeichens ist der Pfad von der Wurzel. Kein Codewort ist Anfang eines anderen (präfixfrei), darum ist der Bitstrom eindeutig lesbar.
Die LZW-Codierung baut beim Lesen ein Wörterbuch auf. Sie beginnt mit den Einzelzeichen, sucht die längste bekannte Folge, gibt deren Nummer aus und trägt die Folge plus das nächste Zeichen als neuen Eintrag ein. Der Empfänger baut dasselbe Wörterbuch selbst auf.
Huffman-Codierung von ABRAKADABRA
Huffman-Codierung von ABRAKADABRA
ABRAKADABRA hat 11 Zeichen: A kommt 5 mal vor, B 2 mal, R 2 mal, K und D je 1 mal. Bestimme einen Huffman-Code und die Länge des codierten Textes.
K (1) und D (1) ergeben einen Knoten mit 2, B (2) und R (2) einen mit 4, dann KD (2) und BR (4) einen mit 6, zuletzt A (5) und 6 die Wurzel. Codes: A = 0, K = 100, D = 101, B = 110, R = 111.
Länge: 5 · 1 + 2 · 3 + 2 · 3 + 1 · 3 + 1 · 3 = 23 Bit. Mit ASCII wären es 88 Bit, die Kompressionsrate ist 88 : 23 ≈ 3,8 (ohne den Baum).
LZW-Codierung von ABABABA
LZW-Codierung von ABABABA
Komprimiere ABABABA mit LZW. Das Wörterbuch enthält anfangs A = 1 und B = 2.
| Rest der Eingabe | längste bekannte Folge | Ausgabe | neuer Eintrag |
|---|---|---|---|
| ABABABA | A | 1 | AB = 3 |
| BABABA | B | 2 | BA = 4 |
| ABABA | AB | 3 | ABA = 5 |
| ABA | ABA | 5 | keiner |
Die Ausgabe 1 2 3 5 hat 4 Zahlen statt 7 Zeichen.
Fehlererkennung: Paritätsbit
Bei Übertragung und Speicherung können Bits kippen. Ein Paritätsbit ergänzt die Daten so, dass die Zahl der Einsen gerade ist (gerade Parität). Für C (1000011, drei Einsen) ist es 1, übertragen wird 10000111. Kommt eine ungerade Zahl von Einsen an, ist ein Fehler passiert. Es erkennt jeden Fehler mit ungerader Zahl gekippter Bits, zeigt nicht, welches Bit falsch ist, und übersieht zwei gekippte Bits.
Fehlerkorrektur: Hamming-Code
Ein Fehlerkorrekturcode fügt mehr Prüfbits hinzu, damit der Empfänger den Fehler behebt. Der Hamming-Code (7,4) schützt 4 Datenbits mit 3 Prüfbits. Die Prüfbits , , stehen an den Positionen 1, 2 und 4, die Datenbits an 3, 5, 6 und 7. Jedes Prüfbit macht die Parität einer Gruppe gerade: über die Positionen 1, 3, 5, 7, über 2, 3, 6, 7 und über 4, 5, 6, 7. Der Empfänger prüft die Gruppen (ungerade: 1, gerade: 0). Die Ergebnisse der Gruppen 4, 2, 1 lesen sich als Binärzahl, und sie nennt die Position des falschen Bits (0: kein Fehler). Zwei gekippte Bits korrigiert der Code falsch.
Hamming-Code anwenden
Hamming-Code anwenden
Codiere die Datenbits 1011 (, , , ). Beim Empfang ist Position 6 gekippt. Finde den Fehler.
über : 1 + 0 + 1 ist gerade, . über : 1 + 1 + 1 ist ungerade, . über : 0 + 1 + 1 ist gerade, . Das Codewort lautet 0110011.
Empfangen wird 0110001. Gruppe 1 (Positionen 1, 3, 5, 7: 0, 1, 0, 1) ist gerade, ergibt 0. Gruppe 2 (2, 3, 6, 7: 1, 1, 0, 1) ist ungerade, ergibt 1. Gruppe 4 (4, 5, 6, 7: 0, 0, 0, 1) ist ungerade, ergibt 1. Die Gruppen 4, 2, 1 lesen sich 110 = 6. Position 6 kippt zurück.
Hashfunktionen zur Integritätsprüfung
Eine Hashfunktion macht aus beliebig langen Daten einen Wert fester Länge. Zur Integritätsprüfung berechnet man den Hashwert einer Datei, etwa mit SHA-256, und vergleicht ihn mit dem veröffentlichten Wert. Schon ein geändertes Bit ergibt einen völlig anderen Hashwert, und praktisch lässt sich keine zweite Datei mit gleichem Wert konstruieren. Eine einfache Prüfsumme wie CRC erkennt zufällige Fehler, schützt aber nicht gegen absichtliche Änderung.
Zweierkomplement als Vorzeichen und Betrag lesen
Zweierkomplement als Vorzeichen und Betrag lesen
"1000 0101 ist −5, denn das höchste Bit ist das Vorzeichen, der Rest ist die 5."
Im Zweierkomplement hat das höchste Bit den Wert −128 (bei 8 Bit). 1000 0101 ist −128 + 4 + 1 = −123. Die −5 lautet 1111 1011.
Zusammenfassung
Hexadezimal fasst je 4 Bit zu einer Stelle zusammen. Im Zweierkomplement hat das höchste Bit den Wert , außerhalb des Bereichs entsteht ein Overflow.
Gleitkommazahlen (IEEE 754) speichern Vorzeichen, Exponent und Mantisse und runden viele Dezimalbrüche. UTF-8 codiert Unicode mit 1 bis 4 Byte.
Digitalisieren heißt Abtasten und Quantisieren. Huffman gibt häufigen Zeichen kurze präfixfreie Codes, LZW baut ein Wörterbuch auf.
Ein Paritätsbit erkennt einen Fehler, der Hamming-Code (7,4) korrigiert einen Einzelbitfehler. Ein Hashwert zeigt, ob Daten verändert wurden.
Übungen
Welche Zahl stellt die 8-Bit-Folge 1111 1010 im Zweierkomplement dar?
Ein Ton wird mit 8000 Messungen je Sekunde, 8 Bit je Messung und einem Kanal 10 Sekunden lang aufgenommen. Wie viele Byte sind das? Schreibe die Zahl ohne Punkt.
Ein Text hat 12 Zeichen: A kommt 6 mal vor, B 3 mal, C 2 mal, D 1 mal. Wie viele Bit hat er mit einem Huffman-Code?
Beim Hamming-Code (7,4) kommt 1110110 an. Welche Position (1 bis 7) ist falsch?
Erkläre, warum ein einzelnes Paritätsbit zwei gekippte Bits nicht bemerkt.