Formel zum Umrechnen von einem in ein anderes system

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

 

DerSatan

Gast

Betreff: Formel zum Umrechnen von einem in ein anderes system

BeitragSo, Aug 19, 2007 19:04
Antworten mit Zitat
Da ich mich mal dafür interessiert habe ob es eine allgemeine Formel zum Umrechnen von einem beliebigen Zahlensystem in das Dezimalsystem gibt habe ich mal das internet bemüht und das her gefunden:

X (die der zahl im anderen System entsprechende Zahl) = a(0) + a(1)*b + a(2)*b² + ... + a(n-1)*b^n-1

wobei a(n) (a(0),...) die Ziffer in der Zahl (von hinten gesehen also in 1101 ist a(0)=1 a(1)=0 a(2)=1 a(3)=1) in dem beliebigen System ist und b das System (16 für hexadezimal, 2 für dual, 10 für dezimal, ...).

Jetzt frage ich mich natülich ob es eine allgemeine Formel gibt, mit der man von dezimalsystem in ein beliebiges System rechnen kann Question ... Vielleicht hat ja jemand hier eine Idee.

EDIT: Quelle ist Wikipedia

D2006

Administrator

BeitragSo, Aug 19, 2007 20:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Zahl x in Stellenwertsystem mit Basis z umrechnen:
Rechne x mod z und schreib das Ergebnis hin. Rechne dann x durch z und schreib den ganzzahligen Wert auf die nächste zeile (also hack den Kommateil ab, wenn vorhanden). Das ganze solange, wie das x noch größer null ist. Dann von unten nach oben sidn die einzelnen Ergebnisse der mod Rechnugn die Ziffern der Zahl.

Beispiel:
Zitat:
x=11; z=2
11 mod 2 = 1
5 mod 2 = 1
2 mod 2 = 0
1 mod 2 = 1

-> 1011

x=78; z=16
78 mod 16 = 14 (=E)
4 mod 16 = 4
-> 4E


Was du da gefunden hast, nennt sich übrigens Horner Schema.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2
 

DerSatan

Gast

BeitragSo, Aug 19, 2007 20:10
Antworten mit Zitat
Vielen Dank für die schnelle Antwort ist ne gute Idee danke für den Hnweis mit dem Horner-Schema.

P.S.: Ich musste mir den Text zwemal durchlesen da ich ncht alles gleich verstanden habe ^^ liegt aber wahrschenlich daran dass morgen für mich die neunte Klasse anfängt mt sowas hatten wir noch nicht gearbeitet^^
 

DerSatan

Gast

BeitragMo, Aug 20, 2007 21:16
Antworten mit Zitat
So ich hab mich jetzt mal hingesetzt und auf die schnelle eine Funktion geschrieben (mit dem Horner-Schema rechnend), die mir jede beliebige Zahl in Zahlensystemen mit 0 bis 9... ach lest im Code nach^^

Code: [AUSKLAPPEN]
Print InDez("4c3",16);4C3(Hex) ist im Dezimalsystem 1219, das kleine c macht auch nix, da in der Funktion sowieso alle Buchstaben grossgemacht werden(in=Upper(in))
WaitKey()
End

Function InDez(in$,base);Umrechnung von einem Alphanumerischen Zahlensystem mit 0-9 einzeln und A-F        ;für 10-15 unter zuhlfenahme des Horner-Schemas
   ;Zur Info: X (die der zahl im anderen System entsprechende Zahl) = a(0) + a(1)*b + a(2)*b² + ... + ;a(n-1)*b^n-1
   ;wobei a(n) (a(0),...) die Ziffer in der Zahl
   ;(von hinten gesehen also in 1101 ist a(0)=1 a(1)=0 a(2)=1 a(3)=1) in dem beliebigen System ist
   ;und b das System (16 für hexadezimal, 2 für dual, 10 für dezimal, ...).
   in=Upper(in)
   If Instr(in,",")<>0 Or Instr(in,".")<>0 Then Return 0;Um zu checken dass nur natürliche Zahlen       ;vorhanden sind; wenn nicht, wird 0 zurückgegeben
   While in<>""            ;\
      in2$=in2+Right(in,1)   ; \
      in=Left(in,Len(in)-1)   ; /-Diese Schleife dreht "in" um
   Wend                  ;/
   in=in2
   For c=0 To Len(in)-1
      Select Mid(in,c+1,1)
      Case "A"
         out=out+10*base^c
      Case "B"
         out=out+11*base^c
      Case "C"
         out=out+12*base^c
      Case "D"
         out=out+13*base^c
      Case "E"
         out=out+14*base^c
      Case "F"
         out=out+15*base^c
      Default
         out=out+Int(Mid(in,c+1,1))*base^c
      End Select
   Next
   Return out
End Function


Ich werde das noch erweitern, wenn ich mal wieder Zeit und Lust habe

EDIT: Sry ich habe den Fehler im Code-Block erst bemerkt als es zu spät war, müsst ihr dann manuell ncoh beheben

aMul

Sieger des Minimalist Compo 01/13

BeitragMo, Aug 20, 2007 21:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Umdrehen kannst du dir sparen. Aber sonst ist die Funktion ganz in Ordnung.
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver
 

DerSatan

Gast

BeitragMo, Aug 20, 2007 21:29
Antworten mit Zitat
Ich hab mir bei Wikipedia nen Artikel gefunden da stand drin , dass de Zahlen in umgekehrter Reihenfolge angezeigt werden müssten... mal nachschauen^^

EDIT: sry dass ich in letzter zeit so viel editiere aber ich hab mal die fünf zeilen mt dem umdrehen weggelassen es kam 964 glaub ich raus das ergebnis ist aber 1219

aMul

Sieger des Minimalist Compo 01/13

BeitragMo, Aug 20, 2007 21:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich sagte nicht, dass die Funktion so falsch ist, oder dass sie richtig ist, wenn man das umdrehen weglässt. Aber um es ein wenig performanter zu gestalten, kann man das Umdrehen weglassen zusätzlich folgende Zeile ändern:
Code: [AUSKLAPPEN]
Mid(in,c+1,1)
; wird zu
Mid(in, Len(in) - c ,1 )

Bei so vielen Aufrufen von Len() würde ich die Länge allerdings gleich zwischenspeichern. Das sollte das ganze noch ein bisschen schneller machen.

EDIT:
Ich war so aufmerksam, und habe mal eben die komplette Funktion einer Generalüberholung unterzogen:
Code: [AUSKLAPPEN]
Function InDez(in$, base)
   in = Upper(in)
   If Instr(in, ",") <> 0 Or Instr(in, ".") <> 0 Then Return
   Local l, c, out, char$
   l = Len(in)
   For c = 0 To l - 1
      char = Mid(in,l - c,1)
      Select char
         Case "A"
            out = out + 10 * base ^ c
         Case "B"
            out = out + 11 * base ^ c
         Case "C"
            out = out + 12 * base ^ c
         Case "D"
            out = out + 13 * base ^ c
         Case "E"
            out = out + 14 * base ^ c
         Case "F"
            out = out + 15 * base ^ c
         Default
            out = out + Int(char) * base ^ c
      End Select
   Next
   Return out
End Function

Davon abgesehen, dass sie nun ca. 30% schneller ist sieht sie nun auch schöner aus. Imho. Smile
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver
 

DerSatan

Gast

BeitragMo, Aug 20, 2007 22:01
Antworten mit Zitat
Hey danke das hat echt geholfen! Ich hatte vorher beim 10000-fachen ausführen der Funktion mit 12 mal Programm starten eine Durchschnittsdauer von 200 jetzt ist es 180 (millisekunden)... das sind von 0,02 Millsekunden pro Funktionsdurchlauf auf 0,018 runtergegangen... mal sehen was sich noch verbessern lässt^^... Embarassed sry hatte dich dann wohl falsch verstanden, hatte nicht daran gedacht das so zu machen udn mit dem Len zwschenspeichern und so, ist jetzt aber getan... Deine "Generalüberholung" is nochmal schneller: 160 der Durchschnitt bei oben erwähnten Bedingungen, also 0,016 pro Funktionsdurchlauf...

Es gibt wirklich nichts was sich nicht verbessern lässt^^

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group