Zahlensysteme und Umrechnung

Manchmal (z.B. bei der Paralellportprogrammierung) ist es ganz nützlich ein Programm zu haben, das zwischen verschiedenen Zahlensystemen umrechnen kann. Ein solches zu schreiben ist eigentlich nicht schwer, wenn man in der Schule richtig aufgepasst hat und die Zahlensysteme verstanden hat. Hat jemand? Nicht? Ok, dann versuche ich das hier zu erklären ohne groß zu verwirren (vermutlich muss man alles zweimal lesen bis man es verstanden hat aber ich denke das ist für euch kein Problem).


Theorie


Also JEDES Zahlensystem hat eine Basiszahl. Das für Computer so wichtige Binärsystem hat die Basiszahl 2, unser "normales" System die Basiszahl 10. das Hexadezimalsystem die 16. In jedem System gibts genauso viele Ziffern wie die Basiszahl ist. Im Binärsystem also 2 (die '0' und die '1'), im Zehnersystem 10 (von '0' bis '9'). Hier muss man auch aufpassen, das man sich nicht vergallopiert, man fängt bei '0' an zu Zählen!
Ich könnte jetzt weiter von Zählregeln erzählen (wie man auf die Nächste stelle springt, was eine Division bewirkt usw.) aber das brauchen wir an der Stelle nicht, also lass ich's weg.

Was brauchen wir noch an Werkzeug? Ach ja die Division und das Potenzrechnen. keine Angst, halb so wild. Was wir bei der Division brauchen ist die ganzzahlige Division. (Vorausgesetzt man kennt sie noch aus der 3. Klasse in der Schule)
Also 77/2 ist nicht 38,5 sondern 38 Rest 1. (Die potenzen lassen stellen wir jetzt mal hinten an, die brauchen wir später.)

 


Umrechnung


Ich will jetzt mal die Umrechnung von einer Zahl im 10er System in ein anderes demonstrieren. (Ich nehm das Binärsystem):

Wir wollen die 77 umrechnen: Also:

 
77 : 2 = 38 Rest 1 
38 : 2 = 19 Rest 0 
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 
Wenn man die Nullen und einsen jetzt von unten nach oben liest hat man die Zahl 77 im Binärsystem.
Zum Vorgehen: Wir nehmen die Zahl die wir umrechnen wollen und teilen sie durch die Basiszahl des Systems in dem wir sie haben wollen. Wir schreiben den Rest auf und teilen den Quotienten wieder. Das machen wir solang, bis der Quotient Null wird, dann sind wir fertig. ACHTUNG: wie im Beispiel kann auch wenn der Quotient Null ist ein Rest bleiben!

Rechnen wir also mal ins Hexadezimalsystem um:

 
77 : 16 = 4 Rest 13 
4  : 16 = 0 Rest  4 
Da es im Hexadezimalsystem Ziffern von '0' bis 'F' gibt, entspricht 'D' der 13 (4 entspricht der '4' das brauchen wir nicht ändern). Wir lesen wieder von unten nach oben den Rest ab und bekommen 4D.
 

Rückrechnung

Die Umrechnung zurück funktioniert auch ganz einfach: Wir im Zehnersystem haben bei jeder Stelle die dazukommt beim Zählen/Rechnen stellt eine Potenz der Basis dar. Hört sich komliziert an, ist es aber nicht: In der Schule haben wir mal gelernt das nach einern die zehner und dann hunderter und tausender folgen. (Die 2. Klasse ist lang her ich weiß ;) Wenn man sich die Reihe 1-10-100-1000 mal genau anschaut ist sie nix anderes wie eine Potenz der Basis:
10 (also Basis) hoch 0 ist 1 (die einer)
10 hoch 1 ist 10 (die zehner)
10 hoch 2 ist 100 (hunderter)
10 hoch 3 ist 1000 (tausender) usw.
Genauso haben wir auch Wertigkeiten im Binärsystem: hier geht die Reihe allerdings so vonstatten: 1-2-4-8-16-32-64..., also:
2 hoch 0 ist 1 (die einer)
2 hoch 1 ist 2 (die "zweier")
2 hoch 2 ist 4 (die "vierer")
2 hoch 3 ist 8 usw.
Beim Rückrechnen machen wir das gleiche wie oben nur umgedreht. Nehmen wir wieder das Binärbeispiel von oben die Zahl war 1001101. wir haben 7 Stellen, die höchste Basispotenz ist also die 6 (also Basiszahl hoch 6 sprich 2^6 weil bei '0' angefangen wird).unsere Zahl heisst also:
 
Hier ist die Zahl
        |
       \ /
       
  2^6 * 1 = 64 
+ 2^5 * 0 = 0 
+ 2^4 * 0 = 0 
+ 2^3 * 1 = 8 
+ 2^2 * 1 = 4 
+ 2^1 * 0 = 0 
+ 2^0 * 1 = 1 
---------- 
=77 

Machen wir noch ein Beispiel aus dem hex-system: 4D hat 2 Stellen, also:
 
Hier ist die Zahl
         |
        \ /
        
  16^1 * 4                                         = 64  
+ 16^0 * 13 ('D' entspricht ja 13) = 13 
--------------------------------------- 
=77 

Anmerkung zum Hexadezimalsystem

Der Grund, warum man überhaupt das Hexadezimalsystem benutzt ist die relativ einfache Umrechnung und die kompakte Art, Binärcode darzustellen. Die Umrechnung ist wirklich einfach: Man kann die Zahl aus dem Dualsystem direkt ablesen. Angenommen man hat folgende Zahl im Dualsystem:

1110101000101000
dann kann man diese in 4-er Blöcke aufteilen und je einen 4-er Block direkt "ablesen". Umgekehrt funktioniert das genauso:

1110 1010 0010 1000  |  A    3    4    F
  |    |    |    |   |  |    |    |    |
  E    A    2    8   | 1010 0011 0100 1111  

Wenn man die 4-er Blöcke von 0-15 nicht im Kopf hat kann man auch in dieser Tabelle schauen:

0000 - 0
0001 - 1
0010 - 2
0011 - 3
0100 - 4
0101 - 5
0110 - 6
0111 - 7
1000 - 8
1001 - 9
1010 - A
1011 - B
1100 - C
1101 - D
1110 - E
1111 - F

Programm

An dieser Stelle möchte ich nur ein Programm zum Download bereitstellen, da mein kleines Umrechnungstool nun schon zu einem kleinen X-Programm gewachsen ist, so das es sich hier nicht mehr kommentieren lässt. Die eigentliche Umrechnung ist in der Datei itob.c zu finden.
Man benötigt Gtk/Gdk-devel um dieses Programm zu compileren.
Die Lösung die hier vorher stand enthielt sehr unsauberen Code, der teilweise noch Fehler enthielt. (Mein Erlebnis mit dieser Funktion bekommt noch ein eigenes Kapitel in diesem Tutorial;-))
umrechner.tar.gz

 

Autor: Baitronic