Lektion 4.1

Daten- und Zahlendarstellung, Kompression, Fehlerkorrektur

21 min Lesezeit

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.

Definition

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 2n2^n 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.

Definition

Zweierkomplement und Overflow

Ganze Zahlen mit Vorzeichen stellt man im Zweierkomplement dar. Bei n Bit hat das höchste Bit den Wert −2n−1-2^{n-1}, die übrigen haben ihre üblichen Werte. Negative Zahlen beginnen daher mit 1. Der Bereich reicht von −2n−1-2^{n-1} bis 2n−1−12^{n-1} - 1, bei 8 Bit von −128 bis 127. Eine negative Zahl bildest du aus der positiven: alle Bits umkehren, 1 addieren. So wird a−ba - b zu a+(−b)a + (-b).

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.

x=−bn−1⋅2n−1+∑i=0n−2bi⋅2ix = -b_{n-1} \cdot 2^{n-1} + \sum_{i=0}^{n-2} b_i \cdot 2^i
Beispiel

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.

Definition

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 12,14,…\frac{1}{2}, \frac{1}{4}, \dots, der Abstand benachbarter Zahlen ist konstant (116\frac{1}{16}), der Bereich klein.

Gleitkommazahlen speichern (−1)v⋅m⋅2e(-1)^v \cdot m \cdot 2^e 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 1,xxx…1,xxx\dots 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".

Beispiel

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.

Definition

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".

Definition

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.

Datenmenge=Abtastrate⋅Bittiefe⋅Kana¨le⋅Dauer\text{Datenmenge} = \text{Abtastrate} \cdot \text{Bittiefe} \cdot \text{Kanäle} \cdot \text{Dauer}
Definition

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.

Beispiel

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).

Beispiel

LZW-Codierung von ABABABA

Komprimiere ABABABA mit LZW. Das Wörterbuch enthält anfangs A = 1 und B = 2.

Rest der Eingabelängste bekannte FolgeAusgabeneuer Eintrag
ABABABAA1AB = 3
BABABAB2BA = 4
ABABAAB3ABA = 5
ABAABA5keiner

Die Ausgabe 1 2 3 5 hat 4 Zahlen statt 7 Zeichen.

Definition

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.

Das Paritätsbit berechnen

Klicke auf die Eingänge A, B und C, um sie zwischen 0 und 1 umzuschalten. Der Ausgang P ist das Paritätsbit für drei Datenbits bei gerader Parität: P ist 1, wenn die Zahl der Einsen unter A, B und C ungerade ist. Prüfe, dass die Zahl der Einsen einschließlich P immer gerade ist.

Definition

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 p1p_1, p2p_2, p4p_4 stehen an den Positionen 1, 2 und 4, die Datenbits d1,…,d4d_1, \dots, d_4 an 3, 5, 6 und 7. Jedes Prüfbit macht die Parität einer Gruppe gerade: p1p_1 über die Positionen 1, 3, 5, 7, p2p_2 über 2, 3, 6, 7 und p4p_4 ü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.

Beispiel

Hamming-Code anwenden

Codiere die Datenbits 1011 (d1=1d_1 = 1, d2=0d_2 = 0, d3=1d_3 = 1, d4=1d_4 = 1). Beim Empfang ist Position 6 gekippt. Finde den Fehler.

p1p_1 über d1,d2,d4d_1, d_2, d_4: 1 + 0 + 1 ist gerade, p1=0p_1 = 0. p2p_2 über d1,d3,d4d_1, d_3, d_4: 1 + 1 + 1 ist ungerade, p2=1p_2 = 1. p4p_4 über d2,d3,d4d_2, d_3, d_4: 0 + 1 + 1 ist gerade, p4=0p_4 = 0. 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.

Definition

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.

Häufige Fehler

Zweierkomplement als Vorzeichen und Betrag lesen

"1000 0101 ist −5, denn das höchste Bit ist das Vorzeichen, der Rest ist die 5."

Richtig ist

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 −2n−1-2^{n-1}, 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

Aufgabe 1Multiple Choice

Welche Zahl stellt die 8-Bit-Folge 1111 1010 im Zweierkomplement dar?

Aufgabe 2Numerisch

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.

Aufgabe 3Numerisch

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?

Aufgabe 4Numerisch

Beim Hamming-Code (7,4) kommt 1110110 an. Welche Position (1 bis 7) ist falsch?

Aufgabe 5Freitext

Erkläre, warum ein einzelnes Paritätsbit zwei gekippte Bits nicht bemerkt.