Beiträge durchsuchen

Umrechnung in verschiedene Zahlensysteme

In der Mathematik gibt es verschiedene Zahlensysteme, die die Darstellung von Zahlen beschreiben. Das bekannteste ist das Dezimalsystem, welches die Zeichen 0-9 benutzt. Weil pro Stelle 10 Zeichen möglich sind, wird es auch Zehnersystem genannt. Dieses System hat also die Basis 10.
Es gibt aber auch andere Systeme, die auf anderen Basen beruhen, wie beispielsweise das Dualsystem (auf Basis 2), das Oktalsystem (auf Basis 8) oder das Hexadezimalsystem (auf Basis 16).
Während Zahlen im Dualsystem (auch Zweiersystem genannt) nur mit Einsen und Nullen dargestellt werden, benutzt das Hexadezimalsystem 16 verschiedene Zeichen zur Darstellung. Darunter befinden sich einmal die normalen numerischen Zeichen 0-9 und zusätzlich die Buchstaben A-F, wobei A für 10 und F für 15 steht.
Das größte Zahlensystem in unserem Algorithmus kann maximal die Basis 36 benutzen (0-9 und A-Z), da es nicht mehr Zeichen zum Darstellen des Systems gibt.
Die Darstellung der Zahlen kann natürlich in andere Darstellungen umgewandelt werden. Beispielsweise entspricht 101101 der Zahl 45, da 32 + 8 + 4 + 1 = 45.

Ein beliebiges System in das Dezimalsystem konvertieren

Die folgende Funktion konvertiert die Darstellung einer Zahl eines beliebigen Systems in das Dezimalsystem, der Rückgabetyp ist also ein Integer. Damit der Zahlraum vergrößert wird, wird aber stattdessen ein Int64 benutzt.

const
  CharDigits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';

function XToDec(const ASource: string; ASourceSystem: Byte): Int64;
var
  i: Integer;
  Value: Byte;
begin
  Result := 0;
  for i := 1 to Length(ASource) do
  begin
    Value := Pos(ASource[i], CharDigits) - 1;
    if (Value >= ASourceSystem) then
      raise EInvalidArgument.Create('Die Quellzahl ist ungültig!');
    Result := Result * ASourceSystem + Value;
  end;
end;

Die Funktion benutzt zum Konvertieren der Zahlensysteme das Hornerschema. Wenn ein ungültiges Zeichen in der Eingabe entdeckt wird, wird eine Fehlermeldung ausgegeben. ASource stellt das Quellsystem dar (z.B. 3B79A5) und ASourceSystem die Basis des Quellsystems (z.B. 12).

Das Dezimalsystem in ein beliebiges System konvertieren

Die folgende Funktion konvertiert die Darstellung einer Zahl des Dezimalsystems in ein beliebiges anderes System. Der Rückgabetyp ist daher ein String, da dieser alle verwendeten Zeichen darstellen kann.

const
  CharDigits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';

function DecToX(ASource: Int64; ATargetSystem: Byte): string;
var
  Rest: Int64;
begin
  Result := '';
  repeat
    Result := CharDigits[(ASource mod ATargetSystem) + 1] + Result;
    ASource := ASource div ATargetSystem;
  until (ASource = 0)
end;

ASource stellt dabei die Dezimalzahl dar und ATargetSystem die Basis des Ausgabesystems.

Darstellung eines beliebigen Systems in ein anderes beliebiges System konvertieren

Mit den aufgezeigten Funktionen ist es nun möglich, ein beliebiges Zahlensystem in ein anderes beliebiges Zahlensystem zu verwandeln.
Soll beispielsweise die binäre Zahl 10100111 in das Hexadezimalsystem (Basis 16) konvertiert werden, geschieht dieses in zwei Schritten:

var
  ZwischenSystem: Integer;
begin
  ZwischenSystem := XToDec('10100111', 2);
  DecToX(ZwischenSystem, 16);
end;

In dem ersten Schritt wird Darstellung der Zahl vom Dualsystem in das Dezimalsystem umgewandelt. In dem zweiten erfolgt die Konvertierung vom Dezimalsystem in das Hexadezimalsystem.