Häufig muss man per Hand in einzelne Zahlensysteme umrechnen, für den Bereich Informatik sind die bekanntesten Systeme das Dezimalsystem (zur Basis 10), Binärsystem (zur Basis 2), Octalsystem (zur Basis 8 ) und Hexadezimalsystem (zur Basis 16) relevant. Der Artikel zeigt eine einfache Umrechnung zunächst von Zahlen aus \mathbb{N}_0, erweitert dies aber dann auf beliebige Zahlen aus \mathbb{R}. Die mathematische Motivation liegt in den so genannten Restklassen und des Körpers der p-adischen Zahlen.

allgemeine Form

Um eine Zahl, die dezimal angegeben ist, zu einer beliebigen Basis (die größer gleich 2 ist) zu schreiben kann man diese mit Hilfe der Modulo-Restklasse umwandeln. Dies geschieht nach folgendem rekursiven Algorithmus1:
  1. function rc = pBase(pnValue, pnBase, varargin)
  2.     % Initialisierung
  3.     lc = ";
  4.    
  5.     % Parameter übernehmen
  6.     if numel(varargin) > 0 && ischar(varargin{1})
  7.         lc = varargin{1};
  8.     end
  9.    
  10.     % Restanteil berechnen und Strings verketten
  11.     lc = cell2mat(horzcat(lc, {' '}, num2str(mod(pnValue, pnBase)) ));
  12.  
  13.     % ganzzahlige Division
  14.     if pnValue > 0
  15.         rc = pBase( fix(pnValue / pnBase), pnBase, lc );
  16.     else
  17.         rc = lc;
  18.     end
Die Berechnung besteht einmal aus der Modulooperation um den Stellenwert s_i und der ganzahligen Division der Basis p, um die nächste Stelle zu ermitteln. Daraus ergibt sich eine allgemein Umrechnung \sum_{i=0}^n s_i \cdot b^i. Am Beispiel des Dezimalsystems kann man sich dies leicht verdeutlichen. Die Zahl 123 besteht aus einem Einhunderter, 2 Zehnern und 3 Einern, d.h. 1 \cdot 100 + 2 \cdot 10 + 3. Nun möchte man nicht die Trennung zwischen Zehner und Hunderter haben, somit schreibt man diese als Potenzen: 1 \cdot 10^2 + 2 \cdot 10^1 + 3 \cdot 10^0. Für eine beliebige Zahl ergibt sich die allgemeine genannte Summenformel. Als Hilfestellestellung für die Darstellung kann man sagen, dass eine Zahl die man zur Basis p angibt, nur die Ziffer \{1, \ldots, p-1\} enthalten darf. Die Darstellung innerhalb dieses Tutorials entspricht der Form (Stellen)_{Basis}

Binärsystem

Als Beispiel liefert der Aufruf
pBase(19,2)
die Binärdarstellung der Zahl (19)_{10} = (110010)_2. So dass man nach der Summenformel die Binärzahl wieder in die Dezimaldarstellung überführen kann:  1 \cdot 2^0 + 1 \cdot 2^1 + 0 \cdot 2^2 + 0 \cdot 2^3 +  1 \cdot 2^4 + 0 \cdot 2^5 = 1 + 2 + 0 + 0 + 16 + 0 = (19)_{10}. Ein wichtiger Punkt die die Reihenfolge der Zahlen; da die
display
Funktion als erstes aufgerufen wird, wird als erstes das Bit mit der niedrigsten Wertigkeit / kleinsten Potenz 2^0 ausgegeben, was der Byte-Reihenfolge Big-Endian entspricht. Würde die Ausgabe nach der IF-Bedingung stehen, würde sich die Byte-Reihenfolge Little-Endian ergeben. Möchte man die Berechnung selbst durchführen ergibt sich folgendes Schema: \begin{array}{rclc}19 &:2 &= 9 &\text{R 1}\\9 &:2 &= 4 &\text{R 1}\\4 &:2 &= 2 &\text{R 0}\\2 &:2 &= 1 &\text{R 0}\\1 &:2 &= 0 &\text{R 1}\end{array} Die Little-Endian Schreibweise ergibt sich, wenn die Restangaben (R) von unten nach oben, die Big-Endian Schreibweise von oben nach unten gelesen werden. Führende Null-Elemente entfallen hierbei.

Octalsystem

Das Octalsystem findet man als Rechtesystem von unixoxiden Betriebsystemen, bei denen die Rechte “readable”, “writeable” und “executable” als dreistellige octale Zahl (zur Basis 8 ) für Verzeichnisse und Dateien angegeben werden. Die Berechnung kann genauso wie bei den Binärzahlen durchgeführt werden, nur dass dann hier die Basis 8 verwendet wird. Alternativ bietet es sich die Zahl zuerst binär umzuwandeln und dann octal darzustellen. Letzteres ergibt sich daraus, dass mit Hilfe von 3 Bits die Zahlen \{0, \ldots, 7\} \Rightarrow 1 \cdot 2^2 + 1 \cdot 2^1 + 1 \cdot 2^0 = 7 dargestellt werden. Für die Zahl oben bedeutet dies, dass die Binärdarstellung einfach in Gruppen zu je drei Bits gebündelt wird und diese wieder zurück ins Dezimalsystem umgerechnet werden, wobei ggf die Stellen auf drei Stellen mit führenden Null-Elementen ergänzt werden müssen. Begonnen wird beim niedrigsten 2^0 Bit: (19)_{10} = (110010)_2 = (\underbrace{110}_3 \ \underbrace{010}_2)_2 = (32)_8 Zur Kontrolle wird die Octalzahl einmal ins Dezimalsystem konvertiert:  3 \cdot 8^0 + 2 \cdot 8^1 = 3 + 2 \cdot 8 = 3 + 16 = 19

Hexadezimalsystem

Das Hexadezimalsystem wird bei Farbdarstellungen, wie man sie z.B. im HTML Bereich für RGB-Werte kennt, verwendet. Hierzu wird das Farbtripel #RGB, das pro Kanal 256 Werte annehmen kann als zwei Zeichen geschrieben, so dass maximal 65.536 verschiedene Abstufungen unterschieden werden können. Die Umwandlung ins Hexadezimalsystem erfolgt entweder durch “Division mit Rest” oder nach dem gleichen Schema wie bei der Octaldarstellung, nur dass nicht drei Bits, sondern 4 Bits gruppiert werden. Als Zusätzliche Unterscheidung der Schreibweise wird noch eine Tabelle eingeführt. Damit keine Verwechslung der Zahlen zwischen 10 und 15 auftritt, werden diese als Buchstaben codiert: \begin{array}{cc} (10)_{10} &= (A)_{16} \\ (11)_{10} &= (B)_{16} \\ (12)_{10} &= (C)_{16} \\ (13)_{10} &= (D)_{16} \\ (14)_{10} &= (E)_{16} \\ (15)_{10} &= (F)_{16} \end{array} Am Beispiel oben sieht das Verfahren wie folgt aus (19)_{10} = (110010)_2 = (\underbrace{1100}_3 \ \underbrace{1000}_{1})_2 = (31)_{16}. Zur Kontrolle: 3 \cdot 16^0 + 1 \cdot 16^1 = 3 + 16 = 19. Ein weiteres Beispiel: (247)_{10} = (\underbrace{1110}_7 \underbrace{1111}_{15 \Rightarrow F})_2 = (7F)_{16}. Zur Kontrolle gilt:  7 \cdot 16^0 + F \cdot 16^1 = 7 + 15 \cdot 16 = 7 + 240 = 247

rationale und irrationale Binärzahlen

Die Berechnung von (ir)rationalen Zahlen erfolgt ähnlich zu dem oben gezeigten Schema. Als Beispiel wird die Zahl 11 \frac{1}{8} = 11,125 genommen. Die Vorkommastelle wird abgetrennt und unabhängig in die Binärdarstellung umgewandelt: (11)_{10} = (1011)_2 Im nächsten Schritt wird die Nachkommestelle in der Dezimaldarstellung umgewandelt: \begin{array}{rclc} 0,125 &\cdot 2 &= 0,25 &\text{R 0} \\ 0,25 &\cdot 2 &= 0.5 &\text{R 0} \\ 0.5 &\cdot 2 &= 0 &\text{R 1}\end{array} Nach der Little-Endian Codierung wird die Zahl von oben, nach der Big-Endian von unten gelesen. somit ergibt sich in der Big-Endian Darstellung (100)_2. Zur Kontrolle gilt analog zu oben: 1 \cdot 2^{-3} + 0 \cdot 2^{-2} + 0 \cdot 2^{-1} = 1 \cdot \frac{1}{2^3} + 0 + 0 = \frac{1}{8} = 0,125. Als weitere Bemerkung ist anzumerken, dass nicht periodische Dezimalbrüche zu periodischen Binärbrüchen führen können. Als Matlab Code lässt sich dies in folgender Form implementieren:
  1. function rc = fraction(pn, varargin)
  2.     % Initialisierung
  3.     lc          = ";
  4.     maxdepth    = 5;
  5.     depth       = 0;
  6.  
  7.     % Parameterübernahme
  8.     if numel(varargin) > 0 && isnumeric(varargin{1}) && abs(varargin{1}) > 0
  9.         maxdepth = varargin{1};
  10.     end
  11.     if numel(varargin) > 1 && isnumeric(varargin{2}) && abs(varargin{2}) > 0
  12.         depth = varargin{2};
  13.     end
  14.     if numel(varargin) > 2 && ischar(varargin{3})
  15.         lc = varargin{3};
  16.     end
  17.    
  18.     if pn < 0 || pn >= 2 || depth >= maxdepth
  19.         rc = lc;
  20.         return;
  21.     end
  22.    
  23.     % Berechnung
  24.     pn = pn * 2;
  25.     if pn >= 1
  26.         lc = strcat(lc, ' 1');
  27.         pn = pn – 1;
  28.     else
  29.         lc = strcat(lc, ' 0');
  30.     end
  31.    
  32.     % nächster Rekursionsschritt
  33.     rc = fraction(pn, maxdepth, depth+1, lc);
Um den Code für eine beliebige Basis zu erweitern, muss mit der Basis multipliziert und der Umbruch bei Überschreiten des Basiswertes mit der Subtraktion dessen durchgeführt werden.

Einer- und Zweierkomplement (negative Darstellung)

Bisher wurden alle Berechnungen nur mit Zahlen größer Null durchgeführt. Letztendlich ist die Berechnung mit negativen Zahlen ähnlich. Hierzu muss noch ein Vorzeichen zu der Zahl notiert werden, dies geschieht bei Binärzahlen durch das Hinzufügen eines weiteren Bit in der Form Vorzeichen | Bitdarstellung. Hier wird das Vorzeichenbit bei positiven Zahlen auf 0 gesetzt, bei negativen auf 1. Für positive Zahlen ergibt sich somit keine größere Änderung. Da der Zahlenkreis der Binärzahlen ohne weitere Struktur zweimal das Element Null enthalten würde, nämlich +0 und -0 muss dieser Asymmetrie Rechnung getragen werden. Hierzu werden nachfolgende Komplemente eingeführt

Einerkomplement

Das Einerkomplement entspricht der Invertierung der Zahl. Für die Zahl (123)_{10} = (1101 111)_2 ergibt sich dann mit Vorzeichendarstellung 0|1101 111, das Einerkomplement ergibt sich dann 1|0010 000

Zweierkomplement

Das Zweierkomplement entspricht dann der Komplementdarstellung einer positiven Binärzahl. Hier wird das Einerkomplement genommen und auf das niederwertigste Bit eine 1 addiert. Somit ergibt sich dann für die Zahl (123)_{10} = (1101 111)_2 \Rightarrow 1|0010 000 + 1 \Rightarrow 1|1010 000 Das Ergebnis kann man prüfen, denn die Addition beider Binärzahlen ohne Vorzeichenbit muss Null ergeben: \begin{array}{lc|cccccccc} & 0 & 1 & 1 & 0 & 1 & 1 & 1 & 1 \\ + & 1 & 1 & 0_1 & 1_1 & 0_1 &  0_1 & 0_1 & 0_1 \\ \hline & & 0 & 0 & 0 & 0 & 0 & 0 & 0 \end{array} Wie man erkennt ergibt sich bei der Addition immer eine 1 als Übertrag, die letztendlich zu einem Überlauf führt und somit das Zeichen für die Überschreitung der Null.

Gleitkommadarstellung

Die Gleitkommadarstellung (IEEE 754) wurde entwickelt um beliebige Zahlen darstellen zu können. Ein wichtiger Aspekt bei der Darstellung ist, dass diese nie exakt ist, da nur endlich viele Dezimalstellen verwendet werden. Man kann sich das etwas vereinfacht als Exponentialschreibweise zur Basis 10 vorstellen: Vorzeichen | \text{Darstellung der Zahl im Bereich [0, 1]} | \text{positiver Exponent mit Bias} Mit den bestehenden Techniken ist diese Darstellung einfach zu erstellen. Für das Beispiel wird die Zahl 12,5 verwendet:
  • zuerst wird die Zahl in den Bereich [0,1] skaliert: 12,5 = 12,5 \cdot 10^0 = 0,125 \cdot 10^2
  • die Mantisse (Zahl vor der Basis) binär umwandeln:  (0,125)_{10} \Rightarrow (0,001)_2 Verwendet wird nur der Teil, der nach dem Dezimalkomma folgt
  • Exponent auf den Bias skalieren. Der Bias ist eine Zahl, so dass nur positive Exponenten entstehen. Für das Beispiel wird der Bias 127 angenommen, d.h. der Exponent wird einfach mit 127 addiert. In dem Beispielfall ergibt sich dann 129. Negative Exponenten werden dann von 127 subtrahiert: 2 \Rightarrow 127 + 2 \Rightarrow 129 und Umwandlung in binäre Darstellung (129)_{10} \Rightarrow (1000 \ 0001)_2
  • Zusammensetzung der Binärdarstellung und ggf. hinzufügen von Präfixnullelementen0 \text{ | } 0010\ 0000 \text{ | } 1000 \ 0001 Bei der Mantisse ist hier die 2^0 links, bei dem Bias rechts angenommen.
  1. wobei die höchstwertigste Stelle zu Beginn, die niederwertigste Stelle am Ende steht. Innerhalb dieses Tutorials stehen die niederwertigsten Stellen links, das eine Big-Endian Darstellung entspricht []