Arbeiten mit verschiedenen Zahlensystemen

(Hinweis: Die Beispiele auf dieser Seite benutzen das ^ Symbol, um die Potenz (entspricht: x "hoch" y) anzuzeigen. Dies dient jedoch nur dem Komfort in diesem Dokument, aktuell unterstützt PureBasic diesen Operator noch nicht! Benutzen Sie stattdessen die PureBasic-Funktion Pow() aus der "Math"-Befehlsbibliothek.)

Allgemein

Ein Zahlensystem stellt eine Möglichkeit zur Darstellung von Zahlenwerten dar, bei der jeweils eine festgelegte Anzahl an möglichen "Symbolen" je Stelle einer Zahl benutzt wird. Das Ihnen aus dem täglichen Leben sicherlich bekannteste Zahlensystem ist das Dezimalsystem, welches auf der Basis 10 (Ziffern 0 bis 9) beruht.

Der Sinn dieser Seite liegt darin, die verschiedenen Zahlensysteme zu erklären und Ihnen zu vermitteln, wie Sie mit diesen arbeiten können. Im Gegensatz zum Dezimalsystem arbeitet der Computer binär (Basis 2) und es gibt gewisse Umstände, wo es vorteilhaft ist diese Arbeitsweise zu verstehen (zum Beispiel bei der Benutzung von logischen Operatoren, Bit-Masken etc).

Übersicht über Zahlensysteme

Dezimal-System

Stellen Sie sich eine Dezimal-Zahl vor, und anschließend wie Sie diese in einzelne Ziffern zerlegen. Wir nehmen als Beispiel die Zahl 1234. Das Zerlegen dieser Zahl in einzelne Ziffern ergibt:
  1   2   3   4
Die Überschrift für jede dieser Ziffern nennt man Potenz. In diesem Fall 10er Potenzen, die von rechts nach links in ihrer Wertigkeit ansteigen. Im Dezimalsystem sind dies Einheiten wie: Einer, Zehner, Hundert, Tausend usw., diese werden wie folgt dargestellt:
  1000  100   10    1
     1    2    3    4
Wir können daraus ersehen, die Zahl 1234 besteht aus
    1*1000=1000
  + 2* 100= 200
  + 3*  10=  30
  + 4*   1=   4
  Summe   =1234
Wenn Sie sich nun die Überschriften der Ziffern ansehen, werden Sie folgendes bemerken: jedesmal wenn Sie eine Spalte nach links gehen, wird mit 10 multipliziert, was ebenso für die Zahlen-Basis gilt. Jedesmal wenn Sie eine Spalte nach rechts gehen, wird durch 10 dividiert. Die Überschriften jeder Spalte kann man auch "Wertigkeit" nennen, da wir zur Ermittlung des vollen Zahlenwerts die Ziffer in jeder Spalte mit der "Wertigkeit" multiplizieren müssen. Wir können die "Wertigkeit" auch mittels Index-Zahlen (in den nachfolgenden Beispielen die kleinen hochgestellten Ziffern) erklären. Zum Beispiel 10^2 bedeutet '10 hoch 2' oder 1*10*10 (=100). Ähnlich, 10^4 bedeutet 1*10*10*10*10 (=10000). Merken Sie sich am besten folgendes: der Index-Wert gibt an, wie oft die Zahl mit sich selbst multipliziert wird. 10^0 bedeutet 1 (da wir nicht mit 10 multiplizieren). Die Benutzung von negativen Index-Zahlen zeigt an, dass wir dividieren müssen, z.B. 10^-2 bedeutet 1/10/10 (=0.01). Der Index-Wert macht mehr Sinn, wenn wir jeder Stelle eine Zahl zuweisen - Sie werden oft Sachen sehen wie 'Bit 0', was eigentlich bedeutet 'Binärstelle an Stelle 0'.
  In diesem Beispiel bedeutet ^ 'x hoch y', z.B. 10^2 bedeutet 10 hoch 2.
  Stellen-Zahl                      3     2     1     0
  Wertigkeit (mittels Index)     10^3  10^2  10^1  10^0
  Wertigkeit (aktueller Wert)    1000   100    10     1
  Beispiel-Zahl (1234)              1     2     3     4
Ein paar Abschnitte weiter oben, haben wir uns angesehen, wie die Zahl 1234 in ihren dezimalen Gegenwert umgewandelt wird. Eigentlich ein bißchen nutzlos, da diese Zahl bereits in Dezimal-Form vorlag. Aber die generelle Methode wurde daran ersichtlich - wie wandelt man eine beliebige Zahl in ihren Dezimal-Wert um:
  B = Wert der Zahlen-Basis
  
  1) Zerlegen Sie die Zahl entsprechend der festgelegten Basis von jeder Stelle.
     Zum Beispiel: wir haben den Wert 'abcde' mit unserer fiktiven Zahlen-Basis 'B',
     die einzelnen Stellen lauten dann:   a   b   c   d   e
  
  2) Multiplizieren Sie jede Stelle mit der dazugehörigen Wertigkeit (diese berechnet sich
     mittels 'B' hoch der Wertigkeit der Stelle):
       a * B^4 = a * B * B * B * B
       b * B^3 = b * B * B * B
       c * B^2 = c * B * B
       d * B^1 = d * B
       e * B^0 = e
  
  3) Errechnen Sie die Summe all dieser Werte. Indem all diese Werte während der Berechnung
     mit ihrem dezimalen Gegenwert niedergeschrieben werden, wird die Berechnung und das
     Ermitteln des Ergebnisses viel einfacher (wenn wir in einen Dezimalwert umwandeln).
Das Umwandeln in die entgegengesetzte Richtung (von Dezimal in die Zahlenbasis 'B') erfolgt mittels Division anstelle der Multiplikation:
  1) Beginnen Sie mit der Dezimalzahl (z.B. 1234), die Sie umwandeln möchten.
  
  2) Dividieren Sie durch die Ziel-Zahlenbasis ('B') und merken Sie sich Ergebnis und den
     Restwert.
  
  3) Dividieren Sie das Ergebnis von (2) durch die Ziel-Zahlenbasis ('B') und merken Sie sich
     Ergebnis und Restwert.
  
  4) Dividieren Sie weiter bis Sie ein Ergebnis von 0 erhalten.
  
  5) Der Wert in der Ziel-Zahlenbasis ergibt sich aus den Restwerten, niedergeschrieben in der
     Reihenfolge der zuletzt berechneten bis zu den zuerst berechneten. Zum Beispiel ergibt
     sich der Wert aus den Restwerten in dieser Reihenfolge: Schritte 4,3,2.
Genauere Beispiele finden Sie in den Abschnitten zu den verschiedenen Zahlen-Basen.

Binär-System

Alles in einem Computer wird binär (Basis 2, ergibt sich aus den Ziffern '0' oder '1') gespeichert, das Arbeiten mit Binär-Zahlen folgt jedoch denselben Regeln wie bei Dezimal-Zahlen. Jede Stelle in einer Binär-Zahl wird "Bit" genannt, eine Kurzform für Binary digit (Binärstelle). Im allgemeinen werden Sie mit den Typen Byte (8 Bit), Word (16 Bit) oder Long (32 Bit) arbeiten, da dies die Standardgrößen der in PureBasic eingebauten Typen sind. Die Wertigkeit eines Bytes wird wie folgt dargestellt:
  (^ bedeutet 'hoch', Zahlenbasis ist 2 für binär)
  Bit/Stelle                      7     6     5     4     3     2     1     0
  Wertigkeit (Index)            2^7   2^6   2^5   2^4   2^3   2^2   2^1   2^0
  Wertigkeit (aktueller Wert)   128    64    32    16     8     4     2     1
Wenn wir zum Beispiel die Zahl 00110011 (Base 2) haben, können wir deren Wert wie folgt ermitteln:
    0 * 128
  + 0 *  64
  + 1 *  32
  + 1 *  16
  + 0 *   8
  + 0 *   4
  + 1 *   2
  + 1 *   1
  =      51
Ein weiteres Beispiel zum entgegengesetzten Konvertieren ist das Umwandeln der Dezimalzahl 69 in eine Binärzahl. Wir erledigen dies wie folgt:
  69 / 2 = 34 R 1     ^
  34 / 2 = 17 R 0    /|\
  17 / 2 =  8 R 1     |
   8 / 2 =  4 R 0     |    Lesen Sie die Restwerte 'R' in dieser Richtung
   4 / 2 =  2 R 0     |
   2 / 2 =  1 R 0     |
   1 / 2 =  0 R 1     |
  (Stoppe hier, da das Ergebnis der letzten Division 0 war)

  Lesen Sie die Restwerte rückwärts, um den Wert als Binär-Zahl zu erhalten = 1000101
Ein weiterer Punkt, der beim Arbeiten mit Binär-Zahlen zu beachten ist, ist die Darstellung von negativen Werten. Bei der alltäglichen Benutzung können wir einfach ein Minus vor die Dezimalzahl setzen. Wir können dies jedoch nicht mit Binärzahlen machen - es gibt jedoch eine Möglichkeit (PureBasic arbeitet hauptsächlich mit vorzeichenbehafteten Zahlen, es muss also einen Weg zum Arbeiten mit negativen Zahlen geben). Diese Methode wird 'twos complement' genannt und neben allen Vorteilen dieser Methode (werden hier nicht näher erläutert, um einige Verwirrung zu vermeiden) ist der einfachste Weg, um davon eine Vorstellung zu bekommen: die Wertigkeit des bedeutendsten Bits ("most significant bit" - MSb ist das Bit mit der höchsten Wertigkeit, bei einem Byte wäre dies das Bit 7) ist ein negativer Wert. Bei einem "two's complement" System, ändern sich die Wertigkeiten der Bits wie folgt:
  (^ bedeutet 'hoch', Zahlenbasis ist 2 für binär)
  Bit/Stelle                       7     6     5     4     3     2     1     0
  Wertigkeit (Index)            -2^7   2^6   2^5   2^4   2^3   2^2   2^1   2^0
  Wertigkeit (aktueller Wert)   -128    64    32    16     8     4     2     1
und Sie werden die Umwandlung von binär zu dezimal auf exakt demselben Weg wie oben beschrieben vornehmen, benutzen aber die neuen Wertigkeiten. Zum Beispiel ergibt die Zahl 10000000 (Base 2) gleich -128, und 10101010 (Base 2) ergibt -86.

Beim Umwandeln einer positiven Binärzahl in eine negative Binärzahl und zurück, invertieren Sie alle Bits und addieren dann 1. Zum Beispiel die positive Binärzahl 00100010 in eine negative Binärzahl umgewandelt ergibt durch Invertierung -> 11011101 und 1 hinzuaddiert -> 11011110.

Diese Vorgehensweise macht das Konvertieren von Dezimal zu Binär einfacher, da Sie negative Dezimalzahlen als ihre positiven Gegenwerte umwandeln können (mittels der oben beschriebenen Methode) und zum Schluß die Binärzahl negativ machen.

Binärzahlen werden in PureBasic mit einem vorangestellten Prozentsymbol geschrieben, und natürlich müssen alle Bits in der Zahl aus '0' oder '1' bestehen. Zum Beispiel können Sie in PureBasic den Wert %110011 benutzen, um 51 darzustellen. Beachten Sie, dass Sie führende Nullen nicht angeben müssen (die eben genannte Binärzahl lautet eigentlich %00110011), es kann aber die Lesbarkeit Ihres Sourcecodes fördern, wenn Sie die volle Anzahl an Bits angeben.

Hexadezimal-System

Hexadezimal (Basis 16, alle Ziffern bestehen aus '0' bis '9' und dann 'A' bis 'F') ist die Zahlenbasis, die beim Umgang mit Computern am häufigsten benutzt wird, da sie von den "nicht auf Basis 10 (Dezimal) beruhenden" Zahlenbasen die für den Menschen am einfachsten zu verstehende Zahlenbasis darstellt. Außerdem enden Ihre Zahlen nicht in langen Strings mit vielen Stellen (wie beim Arbeiten mit Binärzahlen).

Hexadezimale Mathematik folgt denselben Regeln wie dezimal, Sie haben allerdings jetzt 16 Symbole (0-9 und A-F) zur Verfügung. Das Umwandeln zwischen hexadezimal und dezimal erfolgt nach den gleichen Prinzipien wie zwischen dezimal und binär, außer dass die Wertigkeiten jetzt auf Basis 16 anstelle von Basis 2 multipliziert bzw. dividiert werden:
  Stellen-Zahl                      3      2      1      0
  Wertigkeit (mittels Index)     16^3   16^2   16^1   16^0
  Wertigkeit (aktueller Wert)    4096    256     16      1
Das Konvertieren des hexadezimalen Werts BEEF (Base 16) nach dezimal wird wie folgt vorgenommen:
    B * 4096 = 11 * 4096
  + E *  256 = 14 *  256
  + E *   16 = 14 *   16
  + F *    1 = 15 *    1
  =                48879
Und das Konvertieren der Dezimalzahl 666 in einen hexadezimalen Wert wird wir folgt vorgenommen:
  666 / 16 = 41 R 10    ^
   41 / 16 =  2 R  9   /|\    Lesen Sie die Stellen in diese Richtung, denken Sie an das
    2 / 16 =  0 R  2    |     Konvertieren in hexadezimale Symbole wo notwendig
  (Stoppe hier, das Ergebnis gleich 0 ist)
  Hexadezimaler Wert von 666 ist 29A
Eine besonders gute Eigenschaft an Hexadezimal-Zahlen ist, dass diese sehr einfach in Binärzahlen konvertiert werden können. Jede Stelle einer Hexadezimal-Zahl repräsentiert 4 Bits, um also zwischen hexadezimal und binär zu konvertieren, wandeln Sie einfach jede Stelle einer Hexadezimalzahl in 4 Bits um oder umgekehrt jeweils 4 Bits in eine Hexadezimal-Stelle (4 ist ein gerader Divisor für alle bekannten Längen einer Binär-Zahl in einer CPU). Einige Beispiele:
  Hex-Zahl            5        9        D        F           4E
  Binär-Wert        0101     1001     1101     1111       01001110
Wenn Sie Hexadezimal-Zahlen in PureBasic benutzen, stellen Sie diesen ein Dollar-Zeichen voran, zum Beispiel $BEEF.

Zum Abschluss finden Sie hier noch eine Tabelle mit den Zahlen 0 bis 255 im Dezimal-, Binär- und Hexadezimalformat.