Mathematik online lernen im Mathe-Forum. Nachhilfe online
Startseite » Forum » Zahlensysteme umrechnen ohne Zwischenrechnung

Zahlensysteme umrechnen ohne Zwischenrechnung

Universität / Fachhochschule

Tags: Zahlensystem

 
Antworten Neue Frage stellen Im Forum suchen
Neue Frage
MarcelB85

MarcelB85 aktiv_icon

23:18 Uhr, 08.05.2008

Antworten
Hallo,

ich arbeite gerade an einem Programm, um Zahlenformate umzuwandeln. Also Praktisch Hexadezimal in Dual, Dual in Oktal, ... , aber auch vom Zahlensystem mit Basis 5 in Zahlensystem mit Basis 18...

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
Online-Nachhilfe in Mathematik
Antwort
anonymous

anonymous

09:13 Uhr, 09.05.2008

Antworten
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 5mod2=1, was soviel bedeutet, dass die Division von 5 durch 2 den Rest 1 lässt. Es ist "5 \ 2" =2, da das größte Vielfache von 2 kleiner 5 gleich 22 ist.

Man nennt in der Zahlentheorie alle Zahlen, die bei Division durch 2 den Rest 1 lassen kongruent 1 modulo 2.

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 (1352)8 ist. Das ist in unserem Fall 122

Nun gilt
"1352_8 \ 12^2" =510=512
13528mod122=2610=2212

"22_12 \ 12" =2
2212mod12=2

Und so ergibt sich die Darstellung

13528=52212

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

P.S.
Die Anführungszeichen dienen dazu, dass der Formelinterpreter hier meine Modulo-Zeichen nicht verschluckt.
Antwort
m-at-he

m-at-he

09:56 Uhr, 09.05.2008

Antworten
Hallo,

ich gehe davon aus, daß Du bei der Umwandlung in die Dezimalzahlen einfach die SUMME(k=1 ;n;zk10k) 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 (z.B. an der schriftlichen Division angelehnt) für ein beliebiges Zahlensystem schreiben. Du hast dann als Ziffernfolge u.U. BCDEF und sollst das durch 11 teilen, weil Du von Hexadezimal in 17-er-System umwandeln willst. Du mußt also wissen, was ist BC durch 11. Und bist Du statt im Hexadezimalsystem im 18-er-System, dann mußt Du die selbe Aufgabe BCDEF durch 11 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.