005
24.11.2010, 10:38 Uhr
Hans
Library Walker (Operator)
|
Zahlendarstellungen Teil 2
Bisher ging es darum, wie man von der binären, hexadezimalen oder oktalen Darstellung auf die dezimale Darstellung kommt. Dabei blieb die Frage ausgeklammert, wie man der von dezimalen Form zur binären, bzw. hexadezimalen Darstellung kommt. Diese soll nun beantwortet werden.
Dezimal nach Binär
Fangen wir mit dem einfachsten an, nämlich eine dezimale Zahl in eine Binäre umzurechnen. Zum Beispiel die dezimale Zahl 19. Dazu rechnen wir:
Code: |
19 : 2 = 9 Rest 1 9 : 2 = 4 Rest 1 4 : 2 = 2 Rest 0 2 : 2 = 1 Rest 0 1 : 2 = 0 Rest 1
|
Jetzt stellt sich natürlich die Frage, wozu die Reste aufgeführt sind, die bei der Division (also beim teilen) anfallen, und warum ich nicht mit Nachkommastellen weiter gerechnet habe? Die Antwort ist: Wenn man die Reste von unten nach oben aneinander reiht, also 10011, dann hat man die gesuchte binäre Darstellung der Zahl, in diesem Fall also von 19. Gegenprobe:
Code: |
1*2^4 + 0*2^3 + 0*2^2 + 1*2^1 + 1*2^0 = 1* 16 + 0 + 0 + 1* 2 + 1* 1 = 16 + 0 + 0 + 2 + 1 = 16 + 2 + 1 = 19
|
Die Nachkommastellen, die beim Teilen anfallen brauchen wir nicht. Diese spezielle Form der Division mit ganzen Zahlen nennt man auch "modulo"-Rechnung. Dabei wird ermittelt, welcher Rest übrig bleibt, wenn man eine Zahl A durch eine Zahl B teilt, wobei nur ganzzahlige Ergebnisse zugelassen sind. Dazu kommen wir später noch mal. Man kann die Gegenprobe auch mit der weiter oben (vorheriger Artikel) aufgeführten Tabelle machen, dass sieht dann so aus:
Code: |
2^7 | 2^6 | 2^5 | 2^4 | 2^3 | 2^2 | 2^1 | 2^0 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 ----+-----+-----+-----+-----+-----+-----+----- 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1
|
Wir tragen also die oberste Zahl, bzw. das erste Zwischenergebnis unserer Rechnung ganz rechts in der Tabelle ein, und alle weiteren jeweils links davon in der nächsten Spalte. Danach kann man mit Hilfe dieser Tabelle gleich 16+2+1 rechenen, da man die Wertigkeit der einzelnen Stellen sofort sieht.
Als weiteres Beispiel rechnen wir mal die dezimale Zahl 108 in die binäre Darstellung um:
Code: |
108 : 2 = 54 Rest 0 54 : 2 = 27 Rest 0 27 : 2 = 13 Rest 1 13 : 2 = 6 Rest 1 6 : 2 = 3 Rest 0 3 : 2 = 1 Rest 1 1 : 2 = 0 Rest 1
|
Die Reste von unten nach oben aneinander gereiht ergeben 1101100. Zur Probe setzen wir das in die Tabelle ein:
Code: |
2^7 | 2^6 | 2^5 | 2^4 | 2^3 | 2^2 | 2^1 | 2^0 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 ----+-----+-----+-----+-----+-----+-----+----- | 1 | 1 | 0 | 1 | 1 | 0 | 0
|
Das besagt nun, das wir 64+32+8+4 rechnen sollen, um wieder auf die gewünschte dezimale Zahl, also 108 zu kommen.
Dezimal nach Hexadezimal
Nun zu den hexadezimalen Zahlen. Die Methode ist wieder die Gleiche, nur das wir diesmal nicht durch 2, sondern durch 16 teilen. Nehmen wir zum Einstieg mal wieder die dezimale Zahl 19; wir rechnen also:
Code: |
19 : 16 = 1 Rest 3 1 : 16 = 0 Rest 1
|
Die Reste von unten nach oben aneinander gereiht ergeben 13. Das heist also 1*16+3=19. Oder ausführlich:
Code: |
1*16^1 + 3*16^0 1*16 + 3*1 16 + 3 = 19
|
Als weiteres Beispiel nehmen mal eine grössere Zahl, also etwa 2501. Die Rechnung geht dann so:
Code: |
2501 : 16 = 156 Rest 5 156 : 16 = 9 Rest 12 9 : 16 = 0 Rest 9
|
Die Reste sind also 9, 12 und 5. Die Hexadezimale Zahl ist aber nicht 9125, denn für die Reste, deren dezimaler Wert grösser oder gleich Zehn ist, sind ja Buchstaben einzusetzen, wobei diese Zuordnung gilt: 10 <=> a | 11 <=> b | 12 <=> c 13 <=> d | 14 <=> e | 15 <=> f
Für die 12 ist also ein C einzusetzen. Damit ergibt sich die hexadezimale Zahl zu 9c5. Um darauf hinzuweisen, dass es sich um eine hexadezimale Zahl handelt, hängt man häufig ein h an, schreibt also 9c5h. Eine andere Möglichkeit ist ein voran gestelltes Dollarzeichen, das sieht dann so aus: $9c5. Beides bedeutet das Gleiche. Wer jedoch viel mit Intel-Prozessoren zu tun hat, wird hauptsächlich die erste Variante finden.
Wenn man diese Rechnungen nun mit einem Taschenrechner nachrechnet, der zum einen keine Reste kennt, und zum anderen keine Zahlenumwandlung per Knopfdruck durchführt, stellt sich natürlich die Frage, wie man an die Reste kommt? - Das ist möglich, indem man zum einen auf einem Blatt Papier mitschreibt, zum anderen den Rechner ein paar zusätzliche Rechnungen durchführen lässt. Ich demonstriere das mal anhand des vorherigen Beispiels. Wir rechnen also 2501:16 und erhalten 156,3125. Wir notieren:
Code: |
2501 : 16 = 156 Rest
|
Die 156 brauchen wir gleich wieder, deshalb notieren wir sie. Jetzt interessiert uns aber erst mal der Rest, der Division und nicht die Nachkommastellen. Aber genau die brauchen wir jetzt. Dazu ziehen wir die 156 von der Zahl im Display ab, so das nur die Nachkommastellen übrig bleiben, hier also 0,3125. Diese 0,3125 multiplizieren wir mit 16 und erhalten 5 und damit unseren gesuchten Rest, den wir wieder notieren. Zusammengefasst sieht die Rechnung also so aus:
Code: |
////////////////////////////////////////////////////////////////////////////////////// 1. Schritt 2. Schritt 3. Schritt 2501 : 16 = 156,3125 -> 156,3125 - 156 = 0,3125 -> 0,3125 * 16 = 5 <- gesuchter Rest
|
Nachdem wir diesen Rest wieder notiert haben können wir die nächste Stelle berechnen, also:
Von den 9,75 ziehen wir wieder den ganzzahligen Teil, also 9 ab, und rechnen mit dem gebrochenen Anteil weiter. In diesem Fall: 0,75 * 16 und erhalten 12. Die Ermittelung des Restes erfolgt also mit Hilfe zweier weiterer Rechnungen. Also erstes ermitteln wir den gebrochenen Anteil des Ergebnisses, indem wir den ganzzahligen Teil abziehen. Diesen multiplizieren wir anschliessend mit der Basis des Zahlensystems, in das wir die Zahl umrechnen wollen. Die ganze Berechnung mit allen Zwischenschritten sieht also so aus:
Code: |
//////////////////////////////////////////////////////////////////////////////////////// 1. Schritt 2. Schritt 3. Schritt 2501 : 16 = 156,3125 -> 156,3125 - 156 = 0,3125 -> 0,3125 * 16 = 5 <- gesuchter Rest 156 : 16 = 9,75 -> 9,75 - 9 = 0,75 -> 0,75 * 16 = 12 <- also C 9 : 16 = 0,5625 -> -> 0,5625 * 16 = 9
|
Als weiteres Beispiel mal die Zahl 64639, ebenfalls mit allen Zwischenschritten:
Code: |
//////////////////////////////////////////////////////////////////////////////////////// 1. Schritt 2. Schritt 3. Schritt 64639 : 16 = 4039,9375 -> 4039,9375 - 4039 = 0,9375 -> 0,9375 * 16 = 15 4039 : 16 = 252,4375 -> 252,4375 - 252 = 0,4375 -> 0,4375 * 16 = 7 252 : 16 = 15,75 -> 15,75 - 15 = 0,75 -> 0,75 * 16 = 12 15 : 16 = 0,9375 -> -> 0,9375 * 16 = 15
|
Um das zu überprüfen stellen wir mal wieder eine Tabelle auf. Diesmal enthält sie aber keine 2er Potenzen, sondern 16er Potenzen. Wir schreiben unsere Reste von oben nach unten, sowie von rechts nach links in die Tabelle, und erhalten:
Code: |
16^3 | 16^2 | 16^1 | 16^0 4096 | 256 | 16 | 1 -----+------+------+------- 15 | 12 | 7 | 15 F | C | 7 | F
|
Wenn die zweistelligen Ergebnisse noch durch die entsprechenden Buchstaben ausgetauscht werden, erhalten wir die gesuchte Zahl, nämlich FC7F. Zur Probe rechen wir also:
Code: |
15*16^3 + 12*16^2 + 7*16^1 + 15*16^0 15*4096 + 12*256 + 7*16 + 15*1 = 61440 + 3072 + 112 + 15 = 64639
|
Das passt also. Um sich rechenarbeit beim ermitteln der Reste zu sparen, kann es auch nützlich sein, diese ebenfalls wieder in eine Tabelle zu packen, aus der man für den gebrochenen Anteil der Division gleich den zugehörigen Rest ablesen kann. Das würde etwa so aussehen:
Code: |
1:16 = 0,0625 <=> 1 2:16 = 0,125 <=> 2 3:16 = 0,1875 <=> 3 4:16 = 0,25 <=> 4 5:16 = 0,3125 <=> 5 6:16 = 0,375 <=> 6 7:16 = 0,4375 <=> 7 8:16 = 0,5 <=> 8 9:16 = 0,5625 <=> 9 10:16 = 0,625 <=> A 11:16 = 0,6875 <=> B 12:16 = 0,75 <=> C 13:16 = 0,8125 <=> D 14:16 = 0,875 <=> E 15:16 = 0,9375 <=> F
|
Dezimal nach Oktal
Um eine dezimale Zahl in eine Oktale umzurechnen können wir wieder den selben Weg nehmen, wie schon bei den binären und hexadezimalen Zahlen. Wir teilen einfach wieder durch die Basis, und notieren die Reste. Als einführendes Beispiel wieder mal die 19:
Code: |
1. Schritt 2. Schritt 3. Schritt 19 : 8 = 2,375 -> 2,375 - 2 = 0,375 -> 0,375 * 8 = 3 --> 19 : 8 = 2 Rest 3 2 : 8 = 0,25 -> 0,25 * 8 = 2 --> 2 : 8 = 0 Rest 2
|
Aus der dezimalen 19 wird im oktalen also eine 23. Die Zahl 2501 dezimal wird so zu:
Code: |
2501 : 8 = 312 Rest 5 (312,625 -> 0,625 * 8 = 5) 312 : 8 = 39 Rest 0 39 : 8 = 4 Rest 7 ( 4,875 -> 0,875 * 8 = 7) 4 : 8 = 0 Rest 4 ( 0,5 -> 0,5 * 8 = 4)
|
Das heisst 4705 ist unsere gesuchte Oktalzahl. Das kann man auch wieder mit einer Tabelle überprüfen, die jetzt 8er-Potenzen enthält:
Code: |
8^3 | 8^2 | 8^1 | 8^0 512 | 64 | 8 | 1 ----+-----+-----+----- 4 | 7 | 0 | 5
|
Dann wäre eventuell noch die Frage zu klären, wie man von Hexadezimal nach Oktal kommt, und umgekehrt? Dazu kann man die Zahlen erst mal ins dezimale System umrechnen, und von dort ins gesuchte, aber das ist der umständliche Weg. Viel einfacher ist es, über die binären Zahlen zu gehen. Denn wie oben schon (im vorherigen Beitrag) erläutert, umfasst eine oktale Ziffer genau 3 binäre Stellen (3 Bits) und eine hexadezimale Ziffer genau 4 binäre Stellen (4 Bits). Und mit ein bisschen Übung (oder einer Umrechnungstabelle) schreibt man sich erst mal die Bitmuster der einen Zahl hin, und gruppiert die Bits anschliessend neu. Dann ordnet man den Bitgruppen die entsprechenden Ziffern zu und hat das Ergebnis. Nehmen wir zum Beispiel mal die Zahl oktale Zahl 6712. Da jede Ziffer einer Dreiergruppe von Bits entspricht, kann man also (anfangs mit Tabellenhilfe) hinschreiben:
Code: |
oktal 6 7 1 2 binär 110 111 001 010
|
Die Dreiergruppen der Ziffern lösen wir auf und fassen sie zu Vierergruppen zusammen:
Code: |
binär 110 111 001 010 binär 1101 1100 1010
|
ordnen ihnen die Ziffern zu:
Code: |
binär 1101 1100 1010 hex D C A
|
und haben das Ergebnis.
Weiteres Beispiel: 1273 oktal;
Code: |
okt.: 1 2 7 3 bin.: 001 010 111 011 neu gruppieren
bin.: 0010 1011 1011 hex.: 2 B B
|
Umgekehrt geht es genau so:
Code: |
hex.: A B 1 bin.: 1010 1011 0001 neu gruppieren
bin.: 101 010 110 001 okt.: 5 2 6 1
|
Soweit der zweite Teil zum Thema Zahlendarstellungen. Damit wären die ganzen Zahlen und die vier in der EDV gebräuchlichen Zahlensysteme abgehakt. Wer will, kann sich nun ein eigenes Zahlensystem, beispielsweise zur Basis 12 basteln, wenn es der Anwendung nützt. Interessant wäre auch ein Zahlensystem zur Basis grösser/gleich 37, das mit lateinischen Buchstaben auskommt... -- Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung. Dieser Post wurde am 24.11.2010 um 11:32 Uhr von Hans editiert. |