• Keine Ergebnisse gefunden

2.1 Maschineninterne Darstellung von Zahlen und Zeichen

N/A
N/A
Protected

Academic year: 2022

Aktie "2.1 Maschineninterne Darstellung von Zahlen und Zeichen"

Copied!
28
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

2. Zahlendarstellung und Codierungs- techniken

2.1 Maschineninterne Darstellung von Zahlen und Zeichen

2.2 Fehlererkennende Codes 2.3 Fehlerkorrigierende Codes

2.1 Maschineninterne Darstellung von Zahlen und Zeichen

Alle Daten, die ein Digitalrechner speichert und ver- arbeitet, werden intern in Form von Bits dargestellt.

Frage: Wie werden die Datentypen aus den höheren Programmiersprachen in Bitmuster abgebildet?

(2)

Analoge Darstellung

In der analogen Darstellung repräsentiert der techni- sche Parameter (z. B. eine Spannung) direkt den Wert aus der Anwendung. Analoge Werte sind im Allgemei- nen reelle Zahlen (Gleitkommawerte). Beispiel: Die Spannung 1 V entspricht DM 1,00, die Spannung 2,4 V entspricht DM 2,40. Analoge Größen können innerhalb eines vorgegebenen Bereiches jeden beliebigen Wert annehmen.

0 10

20 30

40

Analogiegröße α

α

Probleme der analogen Darstellung

Genauigkeit der analogen Größe

Definitionsbereich der analogen Größe

Arithmetische Operationen auf analogen Größen Wichtige Anwendungsbeispiele

• Audio im Telefonnetz und in der Unterhaltungselek- tronik

• Fernseh- und Videotechnik

(3)

Digitale Darstellung

Die Darstellung von Werten erfolgt in Form von Zahlen (lateinisch: “digitus“: der Finger; Abzählen mit den Fingern).

Beispiel: der chinesiche Abakus (Rechenrahmen)

Darstellung von Zahlen im Rechner

Alle modernen Rechner arbeiten mit Dualzahlen (im binären Zahlensystem).

(4)

2.1.1 Logische Werte

Daten vom Typ “boolean“ (logische Daten) können nur die Werte true oder false annehmen. Daher genügt im Prinzip ein Bit. Häufig erfolgt aber eine Darstellung als ein Byte, da das Byte die kleinste adressierbare und damit direkt zugreifbare Einheit im Rechner ist.

Eine weitverbreitete Konvention ist, dass ein Byte mit nur 0-Bits den Wert false darstellt, während ein Byte mit mindestens einem 1-Bit dem Wert true entspricht. Be- sonders häufig wird dabei das erste Bit im Byte inter- pretiert, da der Prozessor dieses besonders leicht auf 0 oder 1 prüfen kann.

Datentyp Bitstring

Manche höhere Programmiersprachen unterstützen den Datentyp Bitstring. Dieser wird direkt auf eine Folge von Bits im Speicher abgebildet. Dazu gibt es dann eine semantische Erweiterung der Operatoren der Aussagenlogik (¬, ∧, ∨, ...) auf Bitmuster, die dann bitweise verknüpft werden.

2.1.2 Ganze Zahlen

Positive ganze Zahlen

Positive ganze Zahlen sind ein sehr häufiger Datentyp in Anwendungsprogrammen (z. B. als Feldindex, Lauf- variable in Schleifen), aber auch maschinenintern als Speicheradresse usw.

Die Darstellung erfolgt als Dualzahl (Zahl zur Zahlen- basis 2). Dabei entspricht jede Ziffernposition einer Zweierpotenz (wie bei Dezimalzahlen jede Ziffern- position einer Zehnerpotenz entspricht).

(5)

Positive ganze Zahlen

Beispiel

1510 = 11112 Konvertierung

Dual → Dezimal: Ausmultiplizieren

Dezimal → Dual: fortgesetzte Division durch 2 und Notieren der Reste Beispiel

3010 als Dualzahl

30:2 = 15 Rest 0

15:2 = 7 Rest 1

7:2 = 3 Rest 1

3:2 = 1 Rest 1

1:2 = 0 Rest 1

→ 3010 = 111102

Rechnen mit Dualzahlen

Arithmetische Operationen (Addition, Subtraktion, Multiplikation, Division) werden im Dualsystem analog zum Dezimalsystem ausgeführt.

Merke

Eine Multiplikation mit 2 entspricht einem "Linksshift"

der Dualzahl, eine Division durch 2 einem Rechtsshift.

Beispiel für ganze Zahlen im Hauptspeicher

(6)

Oktalzahlen

Das Aufschreiben von langen Bitsrtings braucht viel Platz und ist unübersichtlich. Deshalb wählt man häufig eine Darstellung in Form von Oktalzahlen oder Hexa- dezimalzahlen (Sedezimalzahlen). Dabei ergeben jeweils drei bzw. vier Bits eine Ziffer.

Bitstring Oktalziffer

000 08

001 18

010 28

011 38

100 48

101 58

110 68

111 78

Beispiel

18110 = 0101101012

= 2 6 58

= 2*64 + 6*8 + 5

Hexadezimalzahlen (Sedezimalzahlen) (1)

Jeweils vier Bits ergeben eine Hexadezimalziffer.

Da wir aus dem Dezimalsystem nur zehn Ziffern

kennen, müssen weitere sechs Ziffernbezeichner dazu erfunden werden. Man wählt dazu die Großbuchstaben A bis F.

Bitstring Hexadezimalziffer

0000 016

0001 116

0010 216

0011 316

0100 416

0101 516

0110 616

0111 716

1000 816

1001 916

1010 A

1011 B

1100 C

1101 D

1110 E

1111 F

(7)

Hexadezimalzahlen (Sedezimalzahlen) (2)

Beispiel

18110 = 1011 01012

= B 516

= 11*16 + 5

Die oktale und hexadezimale Darstellung ist nicht nur für Ganzzahlen, sondern auch für beliebige andere Bitstrings gebräuchlich, z.B. zur Definition von Bitstring- Konstanten:

ALL-ONE DC X'FF' LEFT-HALF DC X'F0'

Negative ganze Zahlen

Erste Idee

Wir wählen n-1 Bits für den Betrag als ganze Zahl und ein Bit für das Vorzeichen.

Nachteile

• Die Null gibt es zweimal (+0, -0).

• Die Arithmetik wird durch Fallunterscheidungen komplizierter.

Zweite Idee

Einerkomplement

Eine negative Zahl wird durch Invertieren aller Bits der positiven Zahl desselben Betrages gebildet.

Nachteile

Immer noch zwei Nullen, immer noch komplizierte Arithmetik

Dritte Idee

Zweierkomplement

(8)

Zweierkomplement (1)

Berechnung

Zweierkomplement = Einerkomplement +1 Beispiel für 3-Bit Zahlen:

210 = 0102

-210 = 1012 + 1 = 1102 Vorteile

• Vorzeichen immer noch am ersten Bit erkennbar

• Die Addition negativer Zahlen geschieht wie die Addition positiver Zahlen! (beim Überschreiten der Null geht der Übertrag verloren). Deshalb braucht man nur noch eine Hardware-Schaltung!

• Subtraktion i - j durch Bildung des Zweierkomple- ments von j und Addition!

i - j = i + (-j)

Sehr einfach in Hardware zu bauen!

Zweierkomplement (2)

Die Darstellung auf dem Zahlenkreis veranschaulicht die Ähnlichkeit von Addition und Subtraktion.

(9)

2.1.3 Gleitkommazahlen

Reelle Zahlen (Gleitkommazahlen, floating point num- bers) kann man auf zwei Weisen darstellen: durch Festlegen einer Konvention, wo im Maschinenwort man sich die Kommastelle denkt (Festkommazahl, fixed- point number) oder durch eine Repräsentation in Form von Mantisse und Exponent.

Festkomma-Darstellung (fixed-point number)

• Darstellung reeller Zahlen ohne Exponent

• Festlegung einer festen Anzahl von Stellen vor und nach dem Komma durch Konvention

Beispiel

Darstellung und Addition:

19,125 =0 010011,001000 + 7,625 =0 000111,101000 26,75 =0 011010,110000

Umrechnung Dezimal x10 → Dual x2 für x10 < 1:

0,375 * 2 0,750 * 2 1,500 * 2

1,000 (alle Nachkommastellen = 0 → Ende) Ergebnis 0,37510 = 0,0112 (durch Ablesen von oben

nach unten)

VZ Vorkomma- Nachkommastellen

(10)

Gleitkommazahlen

Repräsentation der rellen Zahl in Form von Mantisse und Exponent:

z = m * ge , m Mantisse, e Exponent.

m ist eine ganze Zahl mit gedachtem Komma vor der ersten Stelle.

e ist ganze Zahl.

g ist die Basis. Sie gilt als implizit vereinbart und wird nicht explizit dargestellt. Gebräuchlich sind g = 2 oder g = 16. (IBM-Großrechner: g = 16)

Merke

m < 0: negative reelle Zahl

e < 0: reelle Zahl mit Betrag zwischen 0 und 1

Beispiele für Gleitkommazahlen

Man überlege sich, wie die arithmetischen Operationen +, -, *, / in der obigen Gleitkomma-Darstellung ausge- führt werden!

Anmerkung 1

Beim Rechnen mit Gleitkommazahlen ist die Genauig- keit beschränkt, da die Länge der Mantisse beschränkt ist. Es treten Rundungsfehler auf.

Anmerkung 2

Sehr kleine Prozessoren unterstützen manchmal Gleit- kommazahlen nicht in Hardware. Ihre Darstellung und Operationen darauf müssen dann in Software durch Unterprogramme des Laufzeitsystems realisiert wer- den. Üblich ist auch die Erweiterung des Rechners um einen zusätzlichen Gleitkommaprozessor, die wesent- lich zur Beschleunigung der Ausführung numerischer Anwendungsprogramme beitragen kann.

e m

Eine Gleitkommazahl werde in einem 32-Bit-Wort dar- gestellt mit 8 Bits für e und 24 Bits für m

(11)

Darstellung der Mantisse

Problem: 0,510 lässt sich darstellen als 0,12 * 20 oder als 0,012* 21 etc.

Lösung: Eindeutigkeit der Darstellung durch normalisierte Mantisse (Basis g = 2),

z.B.: ½ ≤ m < 1, d.h. 0,510 = 0,12 * 20 1 ≤ m < 2, d.h. 0,510 = 1,02 * 2-1

Werden normalisierte Mantissen vorausgesetzt, dann ist das erste Bit immer gleich 0 bzw. 1 und braucht nicht abgespeichert zu werden (sogenanntes “hidden bit“).

Beispiel: Basis g = 2, Exponent e mit 6 Bits, normali- sierte Mantisse m (1 ≤ m < 2) mit 6 Bits, hidden bit.

7,7510 = 111,1102 = (-1)0 *1,1111002 * 22

0

VZ Exponent Mantisse

0 0 0 1 0 1 1 1 1 0 0 0

Versetzte Darstellung des Exponenten

• Diese Darstellung wird auch als Biased- oder Excess-Darstellung bezeichnet

• Zum tatsächlichen Exponenten wird ein bestimmter Wert (Bias) hinzuaddiert. Hat der Exponent n Bits, so beträgt dieser Wert 2n-1.

Beispiel: Basis g = 2, Exponent e mit 6 Bits in Excess- Darstellung, normalisierte Mantisse m (1 ≤ m < 2) mit 6 Bits,Verwendung des hidden bit.

7,7510 = 111,1102 = (-1)0 *1,1111002 * 22 Zu speichernder Exponent E = 2 + 26-1 = 1000102 Vorteil dieser Darstellung: Falls für zwei Gleitkomma- zahlen a ≤ b gilt, so gilt das Gleiche für die (gewöhn- liche) Dualdarstellung von a und b.

Beispiel

a = 0,510 = 1,02 * 2-1 = 0 011111 000000 b = 410 = 1,02 * 22 = 0 100010 000000

Ohne Excess-Darstellung wäre der Exponent von a 1111112 und von b 0000102 (Zweierkomplement).

(12)

Das IEEE-Gleitkommaformat (IEEE 754)

Spezielle Werte (für einfache Genauigkeit, single):

-1022 ... +1023 -126 ... +127

Exponent

1023 127

Excess

64 32

Gesamtbreite (bits)

52 (hidden bit) 23 (hidden bit)

Fraction (= Mantisse ohne hidden bit) (bits)

11 8

Exponent (bits)

1 (0 = positiv, 1 = negativ) Vorzeichen (bits)

double precision single precision

Genauigkeit

NaN (not a number)

≠ 0...02 -128 (1...12)

± ∞ 0...02

-128 (1...12)

1,f * 2e -126 ≤ e ≤ 127 f

0,... * 2-128 (denormale Zahlen)

≠ 0...02 -127 (0...02)

± 0 0...02

-127 (0...02)

Bedeutung Fraction f

Exponent e

2.1.4 Zeichen (characters)

Darstellung in fester Länge

Die Zuordnung von Bitmustern zu den darzustellenden Zeichen nennt man einen Zeichencode. Zur Darstel- lung von Zeichen des Alphabets (Textzeichen, Sonder- zeichen) gibt es internationale Standards. Diese

verwendet eine feste Anzahl von Bits für jedes Zeichen.

ASCII American Standard Code for Information Interchange. Ursprünglich ein 7-Bit- Code, inzwischen als 8-Bit-Code

gebräuchlich, damit auch internationale Zeichen (z. B. deutsche Umlaute) aufgenommen werden können (IA5 = International Alphabet Number 5).

EBCDIC Extended Binary Coded Decimal Inter- change Code. Ein 8-Bit-Code, der auf Großrechnern sehr weit verbreitet ist, vor allem bei IBM

(13)

Darstellung von Zeichen (1)

Beide Codes enthalten

• druckbare Zeichen – Ziffern

– Kleinbuchstaben – Großbuchstaben

– Sonderzeichen (!, ?, $, ...)

• nicht druckbare Zeichen (Steuerzeichen)

– Wagenrücklauf, Zeilenvorschub, Tabulator, Klingeln, etc.

• Gerätesteuerzeichen und Übertragungssteuer- zeichen.

x

0 1 2 3 4 5 6 7 y

0 nul dle 0 @ P ` p 1 s oh dc1 ! 1 A Q ` q 2 s fx dc2 " 2 B R b r 3 e tx dc3 # 3 C S c s 4 e ot dc4 $ 4 D T d t 5 e nq na k % 5 E U e u 6 a ck s yn & 6 F V f v 7 be l e tb ' 7 G W g w 8 bs ca n ( 8 H X h x 9 ht e m ) 9 I Y i y A lf s ub * : J Z j z B vt e s c + ; K [ k { C ff fs , < L \ l | D cr qs - = M ] m } E s o rs . > N ^ n ¬

F s i us / ? O _ o de l Erste 3 Bits

ASCII-Codetabelle (7-Bit-Code)

(14)

ASCII: Bedeutung der Steuerzeichen

Abk. Funktion Funktion (Be de utung de s Ze iche ns )

NUL S OH S TX ETX EOT ENQ ACK BEL BS HT LF VT FF CR S O S I DLE DC1-3 DC4 NAK S YN ETB CAN EM S S ES C FS GS RS US S P DEL

Null

S ta rt of he a ding S ta rt of te xt End of te xt

End of tra ns mis s ion Enquiry

Acknowle dge me nt Audible s igna l Ba cks pa ce

Horizonta l ta bula tion Line fe e d

Ve rtica l ta bula tion Form fe e d Ca rrie r re turn S hift out S hift in

Da ta link e s ca pe De vice control De vice s top

Ne ga tive a cknowle dge me nt S ynchronous idle

End of tra ns mis s ion block Ca nce l

End of me dium

S ta rt of s pe cia l s e que nce Es ca pe

File s e pa ra tor Group s e pa ra tor Re cord s e pa ra tor Unit s e pa ra tor S pa ce De le te /Idle

Nichtige s (ungültige s ) Ze iche n Be ginn de s Kopfe s (Tite ls ) Te xta nfa ng

Te xte nde

Ende de r Übe rtra gung Anfra ge

Empfa ngs be s tä tigung Akus tis che s S igna l Rücks e tze n

Horizonta le Eins te llung (Ta bula tor) Ze ile nvors chub

Ve rtika le Eins te llung (Ta bula tor) Formula rvors chub

S chre ibkopfrückla uf

Ums cha ltung a us (Kle ins chre ibung) Ums cha ltung e in (Groß s chre ibung) Ums cha ltung von Te xt a uf S te ue rze iche n Einhe ite ns te ue rung

Einhe ite nha lt

Ne ga tive Empfa ngs be s tä tigung S ynchronis ie rze iche n (Le e rla uf) Ende e ine s Übe rtra gungs blocke s Aufhe bung

Ende für e in Me dium (Ge rä t) Be ginn e ine r s pe zie lle n Folge Aus wa hl, Tre nnung, Ums cha ltung Da te itre nnze iche n

Gruppe ntre nnze iche n S a tztre nnze iche n

Tre nnze iche n für e ine Informa tions e inhe it Zwis che nra um

Lös che n/ Le e rla uf

EBCDIC-Codetabelle

(15)

Zeichencodes mit variabler Bitlänge

Zeichencodes mit einer festen Anzahl von Bits haben den gravierenden Nachteil, dass sie nicht optimal sind, wenn die Häufigkeit der Zeichen in einem Text nicht gleich verteilt ist. Man kann sich dann Codes über- legen, bei denen Zeichen je nach ihrer Häufigkeit mit einer unterschiedlichen Anzahl von Bits dargestellt werden. Die Codetabelle wird gemäß den Zeichen- häufigkeiten anwendungsabhängig gewählt

Vorteil

Im Mittel weniger Bits zur Darstellung der Anwendungs- daten. Verringert den Speicherbedarf und beschleunigt den Datentransfer.

Nachteil

Zusatzaufwand zum Kodieren/Dekodieren zwischen gebräuchlichen Darstellungen und dem Code mit

variabler Bitlänge. Parsing (Zerlegung der Zeichenkette in die einzelnen Zeichen) wird komplizierter.

Beispiel für einen Code mit variabler Bitlänge (1)

Zeichen Häufig- Code Anzahl

keit (%) der Bits

0 55.5 0 1

1 6.7 1000 4

2 4.5 1100 4

8 3.5 10010 5

3 3.3 10100 5

A 3.2 10101 5

5 3.0 10110 5

6 2.7 11100 5

4 2.7 11101 5

9 2.2 11110 5

7 1.9 100110 6

F 1.5 101110 6

B 1.2 111110 6

[leer] 1.1 110110 6

D 1.0 110100 6

E 0.9 110101 6

Z 0.7 1011110 7

P 0.6 1111110 7

N 0.5 1101110 7

u 0.4 10011110 8

C 0.4 10011100 8

(16)

Beispiel für einen Code mit variabler Bitlänge (2)

H 0.4 10011101 8

R 0.3 10111110 8

M 0.3 11111110 8

L 0.3 11111111 8

S 0.25 11011110 8

I 0.20 100111110 9

T 0.15 110111110 9

K 0.15 110111111 9

Y 0.13 1001111110 10

X 0.12 1001111111 10

G 0.10 1011111100 10

J 0.10 1011111101 10

O 0.06 10111111100 11

Q 0.03 10111111101 11

V 0.03 10111111110 11

W 0.03 101111111110 12

. 0.01 1011111111110000 16

- 1011111111110001 16

? 1011111111110010 16

& 1011111111110011 16

/ 1011111111110100 16

+ 1011111111110101 16

< unter 1011111111110110 16 ) 0.001 1011111111110111 16

( 1011111111111000 16

% 1011111111111001 16

Beispiel für einen Code mit variabler Bitlänge (3)

= 1011111111111010 16

# 1011111111111011 16

? 1011111111111100 16

, 1011111111111101 16

@ 1011111111111110 16

1011111111111111 16

Mittlere Zeichenlänge im Code 0.555 * 1 + 0.112 * 4

+ 0.206 * 5 + 0.76 * 6 + 0.018 * 7 + 0.24 * 8 + 0.005 * 9 + 0.0045 * 10 + 0.0017 * 11 + 0.0003 * 12 + 0.0001 x 16

= 2.91 Bits pro Zeichen

Wesentlich weniger als die üblichen 8 Bits pro Zeichen!

(17)

Der Huffman-Code

David Huffman hat einen Algorithmus zur Konstruktion von optimalen Codes mit variabler Bitlänge ange- geben. Mit diesem Algorithmus konstruierte Codes bezeichnet man als Huffman-Codes.

Algorithmus Erzeuge-Huffman-Code

1. Bestimme die Auftrittshäufigkeiten der Zeichen und schreibe sie an die Blattknoten eines aufzubauen- den Binärbaums an.

2. Nimm die bisher unerledigten zwei Knoten mit den geringsten Häufigkeiten und berechne deren Summe.

3. Erzeuge einen Elternknoten für diese beiden und beschrifte ihn mit der Summe. Markiere die Ver- zweigung zum linken Sohn mit 0, die zum rechten Sohn mit 1.

4. Markiere die beiden bearbeiteten Knoten als erle- digt. Wenn es nur noch einen nicht erledigten Knoten gibt, sind wir fertig. Sonst weiter mit Schritt 2.

Huffman-Code: Beispiel

Kodierbaum

100 1

1

1 1

0

0

0 40 0

60

25

Wahrscheinlichkeit Zeichen Code

30%

30%

10%

15%

15%

A B

C D E

11 10

011 010 00

Wahrscheinlichkeiten der Zeichen:

p(A) = 0.3; p(B) = 0.3; p(C) = 0.1; p(D) = 0.15; p(E) = 0.15

(18)

Huffman-Code: Optimalität

Die Zeichen mit großen Häufigkeiten sind näher an der Wurzel des Baumes und haben somit eine kürzere Codewortlänge; deshalb ist es ein guter Code. Es ist sogar der bestmögliche Code!

Denn:

Die Länge einer kodierten Zeichenfolge ist gleich der gewichteten äußeren Pfadlänge des Huffman-Baumes.

Die “gewichtete äußere Pfadlänge” eines Baumes ist gleich der über alle äußeren Knoten gebildeten Summe der Produkte des “Gewichts” (zugehöriger Häufigkeits- zähler) mit der Entfernung von der Wurzel. Dies ist offensichtlich eine Möglichkeit, die Länge der kodierten Zeichenfolge zu berechnen; sie ist äquivalent zu der über alle Buchstaben gebildeten Summe der Produkte der Häufigkeit des Auftretens eines Buchstaben mit der Anzahl der Bits bei jedem Auftreten.

Kein Baum mit den gleichen Häufigkeiten bei den äußeren Knoten hat eine kleinere gewichtete äußere Pfadlänge als der Huffman-Baum.

Beweisidee

Mit Hilfe des gleichen Prozesses kann ein beliebiger anderer Binärbaum konstruiert werden, doch ohne bei jedem Schritt unbedingt die zwei Knoten mit dem klein- sten Gewicht auszuwählen. Mittels Induktion lässt sich beweisen, dass keine Strategie zu einem besseren Er- gebnis führen kann als die, bei der jeweils zuerst die beiden kleinsten Gewichte ausgewählt werden.

(19)

Dekodieren von Huffman-Codes (1)

Nahe liegend ist eine Dekodierung unter Verwendung des Tries (eines speziellen Binärbaumes):

1. Lies den Eingabestrom sequenziell und traversiere den Trie, bis ein Blattknoten erreicht ist.

2. Gib bei Erreichen des Blattknotens das erkannte Zeichen aus.

Beobachtung

Die Eingabe-Bitrate ist konstant, aber die Ausgabe- Zeichenrate ist variabel!

Decodieren von Huffman-Codes (2)

Als Alternative bietet sich die Verwendung einer Deko- diertabelle an.

Erzeugung der Tabelle

Hat das längste Codewort L Bits, so hat die Tabelle 2L Einträge.

Sei ci das Codewort für Zeichen si. ci habe li Bits. Wir erzeugen 2L-li Einträge in der Tabelle, bei denen jeweils die ersten li Bits = ci sind und die verbleibenden L-li Bits alle möglichen Kombinationen annehmen.

An all diesen Adressen wird si als erkanntes Zeichen eingetragen, zugleich wird li als Codewortlänge ver- merkt.

(20)

Decodieren von Huffman-Codes (3)

Einsatz der Tabelle zur Dekodierung

1. Lies L Bits aus dem Eingabestrom in einen Puffer.

2. Benutze den Puffer als Adresse in der Tabelle und gib das erkannte Zeichen si aus.

3. Entferne die ersten li Bits aus dem Puffer und ziehe weitere li Bits aus dem Eingabestrom nach.

4. Weiter mit Schritt 2.

Beobachtung

Das Tabellenverfahren ist schnell.

Die Ausgabe-Zeichenrate ist konstant, aber die Ein- gabe-Bitrate ist variabel!

Huffman-Code: Kommentare

• Ein sehr guter Code für viele praktische Zwecke.

• Allerdings nur geeignet, wenn die Häufigkeiten der Zeichen a priori bekannt und immer gleich (oder ähnlich) sind.

• Variante: Ermittle die Häufigkeiten für jeden gege- benen Text neu und speichere/übertrage den Code mit den Daten.

• Ein (durchaus berechenbarer) Verlust entsteht da- durch, dass jedes Zeichen mit einer ganzen Zahl von Bits kodiert werden muss und somit die Code- länge den Häufigkeiten nicht ganz (theoretisch opti- mal) angepasst werden kann. Verbesserung: arith- metische Kodierung (auf die wir hier nicht näher eingehen).

(21)

2.2 Fehlererkennende Codes

Definition “Fehler“: Die empfangene Information ent- spricht nicht der gesendeten.

Ein fehlererkennender Code ermöglicht dem Empfän- ger einer Nachricht festzustellen, dass es einen Über- tragungsfehler gegeben hat.

Ein fehlererkorrigierender Code ermöglicht dem Empfänger einer Nachricht festzustellen, wo in der Nachricht es einen Übertragungsfehler gegeben hat;

der Empfänger kann den Fehler ohne erneute Über- tragung reparieren.

Fehlererkennung und Fehlerkorrektur erfordern Redundanz.

Wieviel Redundanz man braucht und wie man die red- undanten Bits am besten generiert, ist Gegenstand der Codierungstheorie.

Man vermutet schon: Fehlerkorrektur benötigt mehr Redundanz als Fehlererkennung.

.

Fehlererkennung (1)

Beispiel für Fehlererkennung: das Paritätsbit. Zu vier Datenbits wird ein Paritätsbit hinzu gefügt. Bei gerader Parität ist die Gesamtzahl der 1-Bits gerade, bei unge- rader Parität ungerade

Beispiel: Gerade Parität

(22)

Fehlererkennung (2)

E Ü b e rtra gu n g d e r Z a h l 7 : 0 1111

K a n a l: 0 1 0 11 F E H L E R !

E m p fa n g : 0 1 0 11

Te s t b e i E m p fä n g er: 0 1 0 11 Æ # 1 g e ra d e E = 0

F E H L E R -E R K E N N U N G E = P a rity-B it o d e r P rü fb it!

E s m u ß ein en F e hler ge ben !

Der Sender berechnet das Paritätsbit und fügt es an die Nachricht an. Der Empfänger berechnet das Paritätsbit neu und vergleicht es mit dem übertragenen Paritätsbit.

Bei Abweichung erkennt er einen Fehler.

Beispiel

Frage: Welche Arten von Übertragungsfehlern kann man mit einem Paritätsbit erkennen? Wie mächtig ist der Code?

Fehlererkennung: Code-Beispiel

Wir betrachten einen Code, der oft in der Telekommu- nikation zur Übertragung von BCD-Zahlen (binary coded decimals) verwendet wird: den 2-aus-5-Code (auch 7-4-2-1-Code genannt).

2 aus 5 ⇒ nur zwei Einsen in 5 Bits

Die Fehlererkennung erfolgt durch Geradzahligkeits- prüfung.

(23)

2.3 Fehlerkorrigierende Codes

Eine Korrektur ist nur möglich, wenn man genau weiß, wo der Fehler liegt. Das erfordert mehr Redundanz, also mehr Bits pro Zeichen als die reine Fehlererken- nung.

Ein fehlerkorrigierender Code ist stets auch ein fehler- erkennender Code.

Prinzip eines fehlerkorrigierenden Codes

1. P o s:

a + c a + b a - c + a - b - 2a 2a O K 2. P o s:

FE H LE R ! K o rre ktur: a, ... , a+ b, a -b

a

(24)

Hamming-Abstand (1)

Hamming-Abstand d

Der Hamming-Abstand d zwischen zwei Codewörtern c1, c2 ist die Anzahl der Bitpositionen, in denen sich die beiden Codewörter unterscheiden.

Beispiel

d(10001001,10110001) = 3 (Anzahl der Bits von c1 XOR c2 )

Hamming-Abstand D eines vollständigen Codes C

( ) C : min { d ( c

1

, c

2

) , c

1

, c

2

C , c

1

c

2

}

D = ∈ ≠

Hamming-Abstand (2)

Satz

Die Fähigkeit eines Codes, Fehler zu erkennen und Fehler zu beheben, hängt von seinem Hamming- Abstand ab.

Erkenne e-Bit Fehler:

Ein Abstand von e + 1 wird benötigt Behebe e-Bit Fehler:

Ein Abstand von 2e + 1 wird benötigt

(25)

Wieviel Redundanz braucht man?

Das Codewort bestehe aus m Zeichen-Bits.

Frage: Wieviele Prüfbits werden benötigt, um jeden 1- Bit-Fehler beheben zu können?

n = m + r, m Datenbits, r Redundanzbits

ƒ Es gibt 2m legale Zeichencodes.

ƒ Pro Codewort muss es n illegale Codewörter im Ab- stand von einem Bit geben.

ƒ 2n ist die Gesamtzahl der darstellbaren Codewörter.

(n+1)2m ≤ 2n = 2m+r (n+1) ≤ 2r

(m + r + 1) ≤ 2r

Dies ergibt die untere Grenze für r.

(8 + r) 2r => r ≥ 4 m = 7

Beispiel:

Code-Beispiele

Fehlererkennender Code

Code mit einem einzigen Paritätsbit (gerade oder ungerade)

=> Hamming-Abstand = 2

=> Erkennung eines 1-Bit-Fehlers ist möglich (oder aller Fehler mit einer ungeraden Anzahl Bits) Fehlerbehebender Code:

Der Code besteht aus vier Codewörtern:

00000 00000, 00000 11111, 11111 00000, 11111 11111

=> Hamming-Abstand = 5

=> Korrektur von 2-Bit-Fehlern ist möglich

nächstes Codewort 2-Bit-Fehler

00000 11111

=>

00000 00111 Beispiel

(26)

Hamming-Code (1)

Der Hamming-Code ersetzt jedes Datenwort von 4 Bits durch ein Codewort mit 7 Bits. Für ein gegebenes Datenwort

m1 m2 m3 m4

bilden wir das Codewort c1 c2 c3 c4 c5 c6 c7.

Die ersten vier Bits c1c2c3c4 sind dieselben wie im Datenwort. Die weiteren Bits werden wie Paritätsbits berechnet:

c5 = Parität von c1 c2 c3 (c1 ⊗ c2 ⊗ c3) c6 = Parität von c1 c3 c4 (c1 ⊗ c3 ⊗ c4) c7 = Parität von c2 c3 c4 (c2 ⊗ c3 ⊗ c4).

Hamming-Code (2)

Insgesamt gibt es 16 Codewörter:

0000000 0001011 0010111 0011100 0100101 0101110 0110010 0111001 1000110 1001101 1010001 1011010 1100011 1101000 1110100 1111111

(27)

Hamming-Code (3)

Decodierung

Ist das empfangene Wort ein gültiges Codewort, wird es akzeptiert. Ist es ungültig, so wird es zum nächsten Nachbarn hin korrigiert. Alle 1-Bit-Fehler können eindeutig korrigiert werden.

Beispiel

1010110 wird zu 1000110 korrigiert (Abstand 1).

Hamming-Code (3)

Veranschaulichung

Codewort: fülle die Bit-Positionen c5, c6, c7 so aus, dass jeder Kreis eine gerade Anzahl Einsen hat.

Das Codewort für m1 m2 m3 m4 = 1 0 1 1 wird dann :

c1 c2 c3 c4 c5 c6 c7 = 1 0 1 1 0 1 0

(28)

Nachteil von fehlerkorrigierenden Codes

Großer Overhead (viel Redundanz), der auch im Falle einer fehlerfreien Übertragung anfällt.

Referenzen

ÄHNLICHE DOKUMENTE

Diese aber sind geschrie- ben, damit ihr glaubt, dass Jesus der Christus ist, der Sohn Gottes, und damit ihr durch den Glauben Leben habt in seinem Namen»..

Sie achtet darauf, dass sie nicht übereinander liegen, und dass sie sich mit einem oder mehreren Kästchen berühren (ein Kästchen eines Rechtecks kann immer nur ein einzelnes

en Zelchem in der semioüschen Forschung 61 III. Das Zeichen als Dialog - Dyadische Zeichentheorie 67 3.1. Allgemeiner Charakter und basale Momente des. binaren Zeichenbegriffs 67

¨ Der Arbeitgeber sorgt dafür, dass Arbeitsplätze regelmäßig aufgeräumt und verschmutzte Arbeits- geräte unverzüglich gesäubert werden.. ¨ Arbeitsbereiche werden ausreichend

Im Nachhinein, wo einige dieser Informationen der Geheimhaltung enthoben wurden, zeigte sich, dass in den Perioden nach den Sprühtests fünf- bis zehnmal mehr Infektionen auftraten

Gleichzeitig sollte aber auch das Verständnis aufgebracht werden, dass nicht alle über 3000 Pflegedienste im Land von heute auf morgen bei knappen Impfstoffka- pazitäten insgesamt

[r]

[r]