[Allegro] Trick 65: Umrechenwerk - Hex, Dez, Bin, Okt, Vig usw.
Bernhard Eversberg
ev at biblio.tu-bs.de
Di Jan 15 11:24:45 CET 2008
Trick 65: Umrechenwerk
Hex, Dez, Okt, Bin, Vig - und noch viel mehr
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.
Mehr Informationen über die Mailingliste Allegro