|
Hallo,
ich arbeite gerade an einem Programm, um Zahlenformate umzuwandeln. Also Praktisch Hexadezimal in Dual, Dual in Oktal, . , aber auch vom Zahlensystem mit Basis in Zahlensystem mit Basis .
Soweit war das Programm bisher nicht allzuschwer umzusetzen, allerdings muss ich immer noch den Zwischenschritt über das Dezimalsystem machen um an mein Ziel zu kommen.
Also statt oktal(1352) direkt umwandeln in duodezimal(522) muss ich immer erst den Dezimalwert(746) berechnen, um hieraus dann den gewünschten Folgewert zu ermitteln. Dies ist ziemlich uneffektiv.Daher wollte ich fragen, ob ihr eine Möglichkeit kennt, die Zahlensysteme ohne Zwischenschritt umzuwandeln.
(Es geht mir nicht um einen Quellcode, sondern um den Ablauf bzw. eine Aussage, ob es überhaupt möglich ist.)
Grüße Marcel
|
|
anonymous
09:13 Uhr, 09.05.2008
|
Hallo,
hast du schon mal was von "Kongruenzrechnung" gehört? Diese gibt es in versteckter Form in den meisten Programmiersprachen in Form von Befehlen wie "mod" und "" in Visual Basic. Es ist beispielsweise was soviel bedeutet, dass die Division von 5 durch 2 den Rest 1 lässt. Es ist "5 \ 2" da das größte Vielfache von 2 kleiner 5 gleich ist.
Man nennt in der Zahlentheorie alle Zahlen, die bei Division durch 2 den Rest 1 lassen kongruent 1 modulo
Wie kannst du das nun für die Umrechnung zwischen Zahlensystemen verwenden?
Ganz einfach:
am besten ermittelst du zunächst die größte Zwölferpotenz, die kleiner als ist. Das ist in unserem Fall
Nun gilt
"1352_8 \ 12^2"
"22_12 \ 12"
Und so ergibt sich die Darstellung
Das ganze lässt sich vermutlich noch viel weiter systematisieren, ich hab gerade den Thread entdeckt und gedacht, ich schreib mal was, nach dem Motto von Heinz Becker "ei wemmer helfe kann:-)
Gruß, Diophant
Die Anführungszeichen dienen dazu, dass der Formelinterpreter hier meine Modulo-Zeichen nicht verschluckt.
|
|
Hallo,
ich gehe davon aus, daß Du bei der Umwandlung in die Dezimalzahlen einfach die SUMME(k=1 berechnest und anschließend iterativ die Division/Modulo-Rechnung ausführst und die Reste "notierst". So würden es wohl alle machen. Aber was soll daran uneffektiv sein. An der Division kommst Du nicht vorbei und Du benutzt hier mit Sicherheit die in Deiner Programmiersprache vorhandenen Möglichkeiten für die Division im Zehnersystem, denn Du dividierst stets zwei Dezimalzahlen. Willst Du nicht über das Dezimalsystem gehen, dann brauchst Du eine Divisionsroutine in dem Ausgangszahlensystem. Da das variabel ist, brauchst Du also eine Divisionsroutine, für die das Zahlensystem, in dem die Division stattfinden soll, ein Parameter ist. Du kannst dann nicht mehr die Division Deiner Programmiersprache benutzen, sondern mußt eine Division . an der schriftlichen Division angelehnt) für ein beliebiges Zahlensystem schreiben. Du hast dann als Ziffernfolge . BCDEF und sollst das durch teilen, weil Du von Hexadezimal in 17-er-System umwandeln willst. Du mußt also wissen, was ist BC durch . Und bist Du statt im Hexadezimalsystem im 18-er-System, dann mußt Du die selbe Aufgabe BCDEF durch ganz anders lösen! Von der Fehleranfälligkeit Deiner Programmierung abgesehen (niemand ist fehlerfrei!), glaube ich auch nicht, daß Du dadurch wirklich schneller bist! Ich würde es genauso machen, wie Du es bisher gemacht hast. Ich würde aus der Not eine Tugend machen: Ich würde als Information immer die Dezimalform mit angeben, die ich sowieso errechnet habe, und es gibt dem Nutzer des Programms eher die Möglichkeit, die Rechnungen zu überprüfen.
Um auf Deine letzte Frage zurückzukommen: Es ist möglich, mit entsprechendem Aufwand! Ob die Laufzeit dadurch verkürzt werden kann, bezweifle ich persönlich, ohne dies konkret nachzuprüfen!
PS @Diophant Die in den Standardprogrammiersprachen vorhandenen Möglichkeiten basieren IMMER auf dem Dezimalsystem, genau diesen Schritt will der Fragesteller aber vermeiden!
|
Diese Frage wurde automatisch geschlossen, da der Fragesteller kein Interesse mehr an der Frage gezeigt hat.
|