Trick 65:
Umrechenwerk
Umrechnen zwischen
Zahlensystemen (Hex, Dez, Bin, ...)
Aufgabe: Schnell mal eben
eine hexadezimale Zahl in ihr dezimales,
oktales, binbäres ... Äquivalent umrechnen. Oder umgekehrt.
Warum: Das Umrechnen von einem
Zahlensystem in ein anderes gehört
zu den Grundaufgaben der Programmierung, und zu den einfachsten
überhaupt. FALLS so etwas also nebenbei mal auftritt, sollte
man dafür eine fertige Prozedur bei der Hand haben, wenn es
schon keinen direkten Befehl dafür gibt. FLEX, das ja keine
richtige Programmiersprache ist, hat leider keinen.
Also her mit einem Unterprogramm, das man unbesehen einbinden
kann! Man muß ja wirklich nicht mehr selber rechnen können
("Ist
Mathematik noch zeitgemäß?" fragte jüngst eine
führende
Zeitung), sondern nur noch wissen, welchem Programm man eine
Aufgabe in welcher Weise zu stellen hat.
Lösung:
Nicht jeder wird das Unterprogramm
sehen und verstehen wollen, daher
wird es hier nicht abgedruckt,
obwohl's nicht groß ist, sondern zum
Download bereitgestellt:
http://ftp.allegro-c.de/aktuelle-version/numcon.inc
Es geht nur um positive ganze
Zahlen! Andere braucht man wohl nie
auf eine andere Basis umzurechnen -
oder doch?
Nebenbemerkung:
Jeder hat andererseits mit dem
Zubehör-"Rechner" von Microsoft ein
geeignetes Werkzeug zur
Verfügung, das auch die Umrechnung zwischen den
genannten Zahlsystemen beherrscht.
Erstens aber kann man es nicht in
FLEX einbinden, und zweitens kann
man mit FLEX, wenn schon, denn schon
auch noch etwas weiter gehen als
Onkel Bill! Die Rechenmethodik, die
man braucht, funktioniert nicht nur
für 2,8,10 und 16, sondern auch
für andere Basiszahlen.
In numcon.inc befindet sich in der Tat eine
Funktion, mit der man jedes
Zahlsystem von 2 bis 20 in jedes andere
umrechnen kann.
Hintergrund:
Warum gerade bis 20? Kelten und
Mayas hatten ein auf 20 basierendes
Zahlensystem. Ganz spurlos
verschwunden ist das nicht! Das französische
Wort für 80, "quatre-vingt"
(vier-zwanzig) kommt daher, es wird aber
schon ab 60 im Zwanzigerschritt
gezählt: 70 ist soixante-dix, nicht
"septante" - außer in Belgien
und teilweise Schweiz. Das englische
"score" hatte früher auch die
Bedeutung zwanzig, und ein Pfund hatte
20 Schillinge. Das Deutsche kannte
mal die Bezeichnung "altes Schock"
für 20 Groschen, ein "Schock"
waren 60, also 3x20. Und es gibt das aus
der Reihe tanzende russische Wort
"sorok" für 40 - das soll aus dem
Persischen stammen. Aber genug
solcher Quisquilien, der Leser wird
schnellstens wissen wollen, wie's
denn nun geht.
Rezept:
Hier knapp das Rezept, wie man den
"Number Converter" anwendet:
Sagen wir, in #uzz steht eine
Hex-Zahl, und sie soll ins Achtersystem
verwandelt werden, das Ergebnis
soll in #uyy. So geht das:
var #uzz " 16
8"
perform numcon
ins #uyy
...
end
Einbindung des UP:
include
numcon.inc
Man übergibt also dem
Unterprogramm drei Zahlen, getrennt durch
Leerzeichen! Allgemein: var
"nnn B Z"
Die erste Zahl, nnn, ist die
umzurechnende, die zweite (B) ist
deren Basiszahl (die kann das
Programm nicht selber erraten!), die
dritte, Z, ist die Zielbasis.
Läßt man die Zielbasis weg, wird dafür 10
genommen, läßt man die
Basis auch weg, wird dafür 16 genommen.
Default ist also die Umrechnung
Hex->Dez, aber B und Z können beide
von 2 bis 20 reichen.
Und was ist der Trick? Das
Unterprogramm ist so verdächtig kurz...
Verbal gesagt, arbeitet es im Kern
so:
1. Die gegebene Zahl in eine
dezimale wandeln.
2. Die ermittelte Dezimalzahl ins
angegebene Zielsystem konvertieren.
So kommt man daran vorbei, sich um
jeden der rund 800 denkbaren Fälle
einzeln kümmern zu
müssen, denn 1. und 2. arbeiten immer in derselben
Weise, nur mit jeweils anderem
Faktor.
SonderTip: Mit X
numcon.inc auch direkt aufrufbar.
Einfach mal probieren.
Vorschau V28.1:
Eingebaut wird die Sache noch in
den umrech.flx.
Den haben Sie schon!
Geben Sie mal ein: X umrech
Und noch was:
Auch in den EXPORTparametern kann
man Zahlen umrechnen!
Dafür haben wir ein
entsprechendes Unterprogramm, das wir bei
Interesse oder Bedarf
zugänglich machen. Es wurde gebraucht für
die Unicode-Datenbank.