Zahlensysteme

weitersagen ...
Tweet about this on TwitterShare on FacebookShare on Google+Share on LinkedIn

Zahlensysteme oder warum 10 auch 2 sein kann

Ohne das Verständnis der drei gebräuchlisten Zahlensysteme im Computer-Bereich (Dezimales-, Binäres- und Hexadezimales-Zahlensystem) wird man bei der Programmierung nicht sehr weit kommen. Daher hier eine kleine Einführung.

Der interessierte Leser wird erfreut sein, dass das erste Zahlensystem ihm schon bekannt ist, das hoffe ich jedenfalls. 😉

1. Dezimalsystem
Unser vertrautes Dezimalsystem beruht bekanntlich auf den Ziffern 0123456789. Wir alle sollten im Umgang damit vertraut sein.
Die Zahl 1984 (eintausend-neunhundert-vierundachtzig) stellt zunächst kein Hinderniss dar. Wir können sie lesen und damit rechnen, sechs dazu oder vierzehn weniger sollten kein Problem sein.

Um die weiteren Zahlensysteme besser zu verstehen möchte ich hier eine mehr mathematische schreibweise aufzeigen.

Die schreibweise mit * und ^ mag den Einen oder Anderen verschrecken, aber so sieht es in einigen Programmiersprachen tatsächlich aus. Selbst schuld, du wolltest ja unbedingt programmieren.
Der Stern * entspricht der Multiplikation (Malzeichen) und das Dach ^ bedeutet hoch, also ist 5*7=35 und 4^3=4*4*4=64.

Allgemein kann man also sagen, dass sich eine Zahl im Dezimalsystem auch als mal 10 hoch <(Position [n] von rechts) – 1> darstellen läßt oder als Formel x*10^(n-1).
Da jede Stelle (‚Ziffer‚) zehn Möglikeiten bietet (0-9) hat das Dezimalsystem also die Basis [b] 10 (lustige Randnotiz, kaum zu glauben, aber Dezi bedeutet doch tatsächlich zehn).

2. Binärsystem
Vor einigen Jahren schickte mir ein Freund eine E-Mail mit dem Inhalt:
Es gibt genau 10 „Arten„ von Menschen:
Die die Binärzahlen verstehen und die die sie nicht verstehen.

Das Binärsystem ist wohl das wichtigste und vorallem grundlegenste Zahlensystem im Computerbereich. Ein Prozessor besteht im Prinzip nur aus einer riesigen Ansammlung von Schaltern (Transistoren). Ist ein Schalter geöffnet, dann kann kein Strom fließen (dies wird als 0 dargestellt) bzw. der Schalter ist geschlossen und es fließt Strom (Überaschung, dafür steht die 1).

Damit haben wir uns auch schon die Basis des Binärsystems erarbeitet. Es gibt je Stelle (‚Ziffer‚) nur zwei (0 oder 1) Möglichkeiten, daher hat es die Basis [b] 2. Die ‚Ziffer‚ wird Bit (aus dem engl. BInarydigiT; binary = binär = zwei Zustände; nicht das Bier!!!) genannt.

Da man mit hunderten Nullen und Einsen (Bits) am Stück wenig anfangen kann, werden diese in logische Gruppen zusammengefasst. Die bekannteste nennt sich Byte, dieses besteht aus 8-Bits. Wie wichtig dies ist, erkennt man daran, dass der C-64 ein sog. 8-Bit Rechner ist.

Wie sehen nun Zahlen im Binärsystem aus? Uns werden häufig Darstellungen wie %00101010 begegnen. Das Prozentzeichen dient häufig als Kennzeichen für eine Binärzahl. Wenn wir nun unsere Formel von oben x*10^(n-1) um eine weitere Variable ergänzen, dann können wir auch Binärzahlen umrechnen. Die 10 wird mit [b] für die Basis ersetzt und schon haben wir eine universell gültige Formel um unsere Zahlensystemen umzurechnen.

Somit lautet unsere Formel: x*b^(n-1)

Wenden wir diese doch direkt mal auf %00101010 an.

Somit entspricht %00101010 der Dezimalzahl 42 (danke für den Fisch).

Binärzahlen lassen sich sehr einfach im Kopf umrechnen. Mit der Wertigkeit eins von rechts beginnend hat jedes Bit, die doppelte Wertigkeit des vorherigen. Nun brauch man nur die Werte zu addieren bei denen das Bit gesetzt ist, also wo eine 1 steht.

Sehen wir uns mal ein BYTE mit lauter einsen (%111111111) an:

Addieren wir nun alle Wertigkeiten erhalten wir 255. Dies ist die größte, mit einem Byte, darstellbare Zahl. Nehmen wir noch den Fall, dass alle BITs = 0 sind hinzu, so kommen wir auf 256 mögliche Zahlen, die mit einem Byte darstellbar sind.

Wie man Binärzahlen ‚manipuliert‚ AND, OR, XOR, ROR, ROL usw. wird im Assembler-Kurs beschrieben.

Wichtig: Spricht man davon, das Xte BIT zu setzen / prüfen, immer daran denken, dass die Zählung von rechts beginnt!
Außerdem werden die BITs in der Praxis von 0 (ganz rechts) bis 7 (ganz links) durchnummeriert.

Bits lassen sich nicht nur zu Bytes zusammenfassen, begegen werden uns noch folgende ‚Gruppen‚:

  • Nibble (damit ist kein Schweinkram gemeint): halbes Byte, 4-Bit
  • Byte: 8-Bit
  • Word: 2-Byte, 16-Bit
  • DWord (DoubleWord) / LWord (LongWord): 2-Word, 4-Byte, 32-Bit

Jetzt sollte auch klar sein, warum 10 manchmal auch 2 ist.

3. Hexadezimalessystem
Da Programmierer schreibfaul sind und das Binärsystem mit der Basis [b] 2 nicht so schön ins Dezimalsystem passt wurde das Hexadezimalezahlensystem geschaffen. Dieses erlaubt es je Stelle (‚Ziffer‚) ein Nibble abzubilden. Wie wir oben gelernt haben besteht ein Nibble aus 4-Bit, somit lassen sich mit einer zweistelligen Hex-Zahl (ich kürze Hexadezimaleszahlensystem nun ab) Zahlen von 0 bis 255 darstellen.

Wie funktioniert das?
Jeder Dezimalzahl des Nibbles wird eine ‚Hex-Ziffer‚ zugewiesen. Zunächst nicht schwer: 0, 1, 2, 3, 4, 5, 6, 7, 8 und 9 bleiben einfach erhalten, aber was ist mit 10, 11 ,12, 13, 14 und 15? Hierfür wurden einfach die ersten sechs Buchstaben des Alphabets (A, B, C, D, E und F) genommen.

Schauen wir uns das mal in einer Tabelle genauer an.

Als erstes sollte das Dollarzeichen $ auffallen, dies wird häufig zur Kennzeichnung von Hex-Zahlen verwendet. Nun sollte z. B. die Umwandlung unserer Binärzahl %00101010 ins Hex-Format nicht mehr schwerfallen. Dazu trennen wir das Byte einfach in die beiden Nibble %0010 und %1010. Ermitteln die Dezimalzahlen für jedes Nibble 2 und 10 und suchen uns die dazugehörigen Hex-Ziffern $2 und $A heraus. Diese können nun einfach als eine Hex-Zahl $2A betrachtet werden.

%00101010 = $2A = 42

Nun sollte man erkennen, warum die Kennzeichnung der unterschiedlichen Zahlensystem so wichtig ist. Wie sollte man sonst 10; %10 und $10 unterscheiden?

Wie sieht es nun mit unserer schlauen Formel x*b^(n-1) aus? Die Basis [b] ist hier 16, da jede Stelle (‚Ziffer‚) sechzehn (0-9; A-F) verschiedene Möglichkeiten bietet.

Nehmen wir als Beispiel mal das Word $07C0.

Um aus unserer Hex-Zahl $07C0 eine Binärzahl zu machen, brauchen wir nur jede Stelle (‚Ziffer‚) als Nibble hintereinander weg schreiben.

Auch wenn es nicht zwingen notwendig ist, schreibe ich bei Binär- und Hex-Zahlen führende Nullen immer bis zur nächsten logischen Gruppen-Grenze mit. Bei unserem Beispiel von eben wäre dies ein Word, daher schreibe ich $07C0 statt $7C0 und %0000011111000000 statt %11111000000. Ich finde es liest sich besser und man sieht direkt, mit welchen Größen man es an der jeweiligen Stelle im Programm zu tun hat.

4. Dezimal in Binär oder Hex umrechnen
So, wir wissen nun, wie man Bin- (Binär) und Hex-Zahlen ins Dezimal-System umrechnet und von Bin nach Hex und Hex nach Bin kommt, aber wie rechnen wir Dezimalzahlen in die anderen Systeme um?

Wie wird nun aus 42 wieder eine Bin-Zahl? Dazu müssen wir wieder die Basis [b] des Ziel-Systems bemühen und vorher klären, was der Modulo ist. Der Modulo ist der ganzzahlige Rest einer Division. In der Programmierung wird dieser häufig mit dem Prozentzeichen % abgebildet, nicht mit dem Binärkennzeichen zu verwechseln!

11%3 = wird 11 geteilt durch 3 gerechnet (macht 9) bei einem Rest von 2
Also ist der Modulo 2, da die drei dreimal komplett in die 11 passt (3*3 = 9) und somit ein Rest von 2 (11-9) übrig bleibt.

Dieser Modulo hilft uns nun die Dezimalzahlen umzurechnen.

Schauen wir uns ein Beispiel mit der altbekannten 42 an. Um zur Bin-Zahl zu kommen, bilden wir solange den Modulo der Basis [b] 2 (0 / 1) des Binär-Systems, bis wir als ganzzahliges Ergebnis 0 erhalten.
Wir teilen also 42 durch 2, das geht glatt auf 21, es bleibt kein Rest, wir notieren eine 0.
Nun bilden wir den Modulo für das ganzzahlige Ergebnis der vorherigen Rechnung, also 21 durch 2 teilen, da kommen wir auf 10, behalten aber einen Rest von 1, diese notieren und mit 10 durch 2 fortfahren…

Nun sollte sich diese Tabelle eigentlich selbst erklären:

Schreiben wir nun das, was als Rest übrigblieb, von unten nach oben hintereinander, erhalten wir wieder unsere bekannte Bin-Zahl %101010, die wir zum besseren Lesen noch auf die Bytegrenze auffüllen können %00101010.

Das Umwandeln von 1984 in eine Hex-Zahl läuft nahezu identisch ab, nur das hier die Basis [b] bekanntlich 16 (0-9; A-F) ist.

Auch hier wieder, das was als Rest übrigblieb, von unten nach oben, einfach hintereinander wegschreiben und wir bekommen $7C0 bzw. etwas lesbarer $07C0.

Wie weiter oben bereits erwähnt, sind Programmierer auch nur Menschen und neigen zur Bequemlichkeit. Daher ist es keine Schande z. B. den Windows-Taschenrechner zu starten und über Ansicht auf ‚Programmierer‚ zu stellen.

Das Hauptthema dieser Seite, ist zwar die Programmierung in Assembler.
Aber wer noch nie mit der Programmierung und Kontakt gekommen ist und direkt etwas Greifbares haben möchte, der kann in einem kleinen BASIC-Kurs erstmal die Bekanntschaft von Variablen, Schleifen, Sprüngen und Co. machen.

Wer aber direkt loslegen möchte, sollte alles Einrichten und dann zum Assembler-Bereich springen.

Thank you for your cooperation.


Schrott!!Naja...Geht so...Ganz gut...SUPER! (16 Bewertungen | Ø 4,63 von 5 | 92,50%)

Loading...


 

<<< zurück | weiter >>>

weitersagen ...
Tweet about this on TwitterShare on FacebookShare on Google+Share on LinkedIn

2 Gedanken zu „Zahlensysteme“

Schreibe einen Kommentar


Beachtet bitte, dass ich eure Kommentare erst manuell freigegeben muß, bevor sie auf der Seite erscheinen! Da ich nicht pausenlos am Rechner sitze, kann es schon mal etwas dauern, bis ein Kommentar für alle sichtbar ist.

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Protected by WP Anti Spam