Sönke Tesch: Mit Hex-Zahlen rechnen

Beitrag lesen

Ich bastle mir gerade eine ASP(VBScript)-Seite, wobei ich mit Zahlen im Hexadezimalsystem rechnen muss. Leider habe ich bis jetzt noch keine bessere Lösung gefunden, als die Daten ins Dezimalsystem umzuwandeln, zu rechnen und wieder ins Hexadezimalsystem zu konvertieren.

Das Prinzip ist recht simpel und funktioniert genauso wie bei Dezimal- oder Binärzahlen.

Als erstes solltest Du Dir klar darüber werden, daß der Computer weder Hexadezimal-, noch Dezimal-, noch sonst irgendwelche Zählzysteme kennt. Was Du da sicherlich vor Dir hast, sind für den Computer Texte.

Ein Text besteht aus Buchstaben, jeder Buchstabe eines -nennen wir es mal- "Zahlwortes" stellt eine Stelle im jeweiligen System dar. Nehmen wir mal eine Dezimalzahl 23:

4 2
 | +- Einerstelle  = 10^0 (10 hoch 0)
 +--- Zehnerstelle = 10^1 (10 hoch 1)

Wie Du vielleicht schon siehst, kann man diese 23 auch in Einzelteile zerlegen:

42=4*10^1 + 2*10^0

Um also aus einem "Zahlwort" ein echte Zahl zu machen, muß man lediglich die einzelnen Stellen mit dem jeweiligen Wert multiplizieren und diese Ergebnisse dann addieren.

Programmansätze gibt's dafür viele, ich benutze immer die Schiebemethode: Es wird von links nach rechts jeweils eine Ziffer eingelesen. Bevor eine Ziffer gelesen wird, wird unser Ergebnis um eine Stelle nach links verschoben (x*10), dann die Ziffer gelesen und zum Ergebnis zuaddiert:

Für 42 wäre das:
  Ausgangsposition                         > zahl=0
  Ziffer 2 einlesen und zu zahl addieren   > zahl=4
  zahl eine Dezimalstelle nach links (*10) > zahl=40
  Ziffer 3 einlesen und zu zahl addieren   > zahl=42
  Keine Ziffer mehr vorhanden, fertig!     > zahl=42

Der einzige Unterschied zwischen Dezimal-, Hex-, Oktal- und Binärziffern ist die Basis, um die verschoben wird. Im Dezimalsystem ist das (wie gesehen) 10, im Hexsystem 16, Oktal 8, Binär 2. Statt also zum Schieben mit 10 zu multiplizieren mußt Du bei Hexzahlen mit 16 multiplizieren.
Das ist der ganze Trick dabei.

Die Umwandlung der Ziffern 0-9 und A-F in Zahlen von 0-15 kriegst Du sicher selbst hin, zum Beispiel mit einer case- (bzw. switch-) Anweisung.

Für die Umwandlung von Zahlen in Hexadezimal-Zahlworte mußt Du wiederum die Zahl in ihre Einzelteile, also ihre Stellen zerlegen. Das geht mit Dividieren und ich kenne nur eine etwas aufwendigere Lösung.

Und die gute Nachricht zuletzt: Eigentlich hat jede Programmiersprachen eingebaute Funktionen, mit denen sich Texte in Zahlen und Zahlen in Texte umwandeln lassen. Für C fällt mir da scanf und printf ein, Modula-2 kennt str2int und writeformat, VB sollte etwas ähnliches haben.

Gruß,
  soenk.e