std::string str_D="241563"; DEC in HEX std::string str_H="3AF96";
-
Hi,
Ich habe eine Zahl in einem String, und würde diese gerne in Hexadezimalform bringen. Wichtig ist, daß die Zahl im String theoretisch unendlich groß sein kann.
Es ist also nicht erlaubt:unsigned long Zahl; std::stringstream strstr; std::string_D("123456"); strstr << string_D; //Hier könnte die Zahl größer sein, als der reservierte unsigned long int strstr >> Zahl;Weiß jemand ne gute Lösung ???
Gruß
-
-

Die Seite ist richtig gut, danke. Leider kenne ich den Inhalt aber schon.
Hatte gehoft, daß es ne gute Funktion gibt.
Muß ich selber schreiben ??

gruß
-
Du musst die Umwandelung selbst schreiben.
to_hex(s){ o = "" while(s != 0){ o += s mod 16 s = s div 16 } reverse o return o }mod 16 kannst du als Wertetabelle implementieren, welche bei der du die 4 letzten Ziffern als Index verwendest.
div 16 kannst du als 4-fach verschachteltes div 2 implementieren. div 2 sollte in dezimal Schreibweise leicht sein.
-
Hi Ben04,
Danke für super Antwort.
Ev. kannst mir ein Tipp geben wiso die letzten 4 Reichen bei mod 16 ??
Das ist mir leider nicht klar. Bin bei der Überlegung auf drei gekommen.
-
123456789 kannst du in 12345 * 10000 + 6789 zerlegen. Da 16 10000 teilt gilt (12345 * 10000 + 6789) mod 16 = 6789 mod 16. Diese Zerlegung geht natürlich analog mit beliebigen Ganzzahlen.
3 Zifferen reichen nicht, da 0 mod 16 = 0 aber 1000 mod 16 = 8.
-
Ben04 schrieb:
Du musst die Umwandelung selbst schreiben.
Zusätzlich brauchst du aber noch eine Klasse/Bibliothek, die unendlich große Zahlen aufnehmen kann, z.B. GMP
-
Badestrand_off schrieb:
Ben04 schrieb:
Du musst die Umwandelung selbst schreiben.
Zusätzlich brauchst du aber noch eine Klasse/Bibliothek, die unendlich große Zahlen aufnehmen kann, z.B. GMP
Nein
-
Okay Super Hab ich verstanden
Danke
Das hat mir richtig richtig weitergeholfen.

bei 32 bit läuft es dann gleich (Muß es wiederholen, damits im Kopf bleibt).
100000 / 32 ohne Rest teilbar ist, ist (x * 100000 + y) mod 32 = y mod 32
Das ist das kleinste gemeinsame Teiler Problem oder ??
Gibts da Zusammenhänge mit Primzahlen ??Gruß
-
Es könnte noch ein wenig effizienter gehen als mit einer Lookuptabelle. Es seien a, b, c, d die 4 letzten Ziffern deiner Zahl ASCII kodiert. Dann ist
to_hex(((a-'0')*1000 + (b-'0')*100 + (c-'0')*10 + (d-'0')) % 16) mit to_hex(x) = x < 10 ? x+'0' : x+('A'-10)
die letzte Ziffer als ASCII kodiert deiner Hexzahl. Der Compiler dürfte diese Formel bereits sehr stark optimieren können. Weil ich aber gerade Lust hab mach ich es mal von Hand.

to_hex((((a*10+b)*10+c)*10+d - '0'*1111)&31)
Das sieht schnell aus. Der innere Teil ist auch Pipeline freundlich. Die Verzweigung im to_hex scheint mir das teuerste zu sein. Dagegen fällt mir auf die schnelle aber auch nichts ein.
AlexXXx schrieb:
Okay Super Hab ich verstanden
Danke
Das hat mir richtig richtig weitergeholfen.

bei 32 bit läuft es dann gleich (Muß es wiederholen, damits im Kopf bleibt).
100000 / 32 ohne Rest teilbar ist, ist (x * 100000 + y) mod 32 = y mod 32
Das ist das kleinste gemeinsame Teiler Problem oder ??
Gibts da Zusammenhänge mit Primzahlen ??Es reicht die letzten d Ziffern einer Zahl zur Basis b anzuschauen um ihren Wert modulo m zu berechnen, genau dann wenn m b^d teilt.
Für b = 10 = 2*5 und m = 2a*5b heißt das, dass das kleinste d = 10^max(a,b) ist.
-
Ben04 schrieb:
Badestrand_off schrieb:
Ben04 schrieb:
Du musst die Umwandelung selbst schreiben.
Zusätzlich brauchst du aber noch eine Klasse/Bibliothek, die unendlich große Zahlen aufnehmen kann, z.B. GMP
Nein
Dann verstehe ich deinen Algorithmus nicht, der arbeitet doch mit einer Ganzzahl als Eingabe, oder nicht?
Falls ja: Eingabe ist doch eine (u.U. sehr große) Dezimalzahl in Textform.
Falls nein: Dann bitte ich um mehr Erklärung
-
Eingabe ist ein String von Ziffern, Ausgabe ist ein String von Zifferen und alle Zwischenwerte sind Strings und kleine Ganzzahlen.
Der Algo dürfte wesentlich schneller sein, als irgendeine Bigint-Bibliothek da der Wert nicht binär zwischenkodiert wird. Er geht aber nur, solange die Ziel Basis von der Form 2^n ist.
-
Oki doki, hab's jetzt verstanden, hatte deine Erklärung von 19:18 Uhr übersehen
Ist ja ne coole Sache 
-
Ziemlich cool das ganze

Aber ich habe Probleme dir zu folgen beiBen04 schrieb:
Für b = 10 = 2*5 und m = 2a*5b heißt das, dass das kleinste d = 10^max(a,b) ist
Ich habe mal "m = 2a*5b" durch "m = 2x*5y" ersetzt da b bereits 10 ist.
Hoffe ich habe da nichts mißverstanden, und das b enthält dadurch nicht auch information daß es von dir doppelt verwendet wurde.
Dann ist noch m gleich 16.
Das Heißt wenn 16 = 2^x * 5^y dann ist "d = 10^max(x,y)".
Es geht jetzt ja darum min(d) zu finden. Wobei min(d) f(x,y) ist.Kann ich für
Ben04 schrieb:
to_hex((((a*10+b)*10+c)*10+d - '0'*1111)&31)
Auch
to_hex((((a*10+b)*10+c)*10+d - '0'*1111)&0x0F)
schreiben?? Oder brauche ich das eine Bit noch ??
Meine Überlegung ist:
Basis b=2;
m = 16;
und d hätte ich dann antatt zu 9 zu 8 gewählt.
dann teilt 16 2^8=256.
Ich frage nicht aus geschwindigkeitsgründen
sondern weil ich mir vorstellen kann das hier wieder zu verwenden für andere Aufgaben, und dann muß ich es verstanden haben.(Fragen die mich schon lange löchern ggg)
//--------------------------------------------------------------------------//
-Könnte man f(x,y) als Funktional auffassen, und die Euler-Lagrangschen Glichungen darauf anwenden (Schwache Lösung) f(x,y(x),y'(x)) ??
-Gibt es einen Zusammenhang zwischen der schwachen Lösung und Fourier/Laplace-Transformation ??
(Zum Beispiel daß man die Ableitung in der Euler-Lagrangschen Gleichung durch
die Multiplikaiton mit der reellen Exponentialfunktion oder der komplexen Exponentialfunktion ersetzt??)
-
Basis b=2;
m = 16;
und d hätte ich dann antatt zu 9 zu 8 gewählt.
dann teilt 16 2^8=256.
Ich frage nicht aus geschwindigkeitsgründen
sondern weil ich mir vorstellen kann das hier wieder zu verwenden für andere Aufgaben, und dann muß ich es verstanden haben.ich meinte
Basis b=2;
m = 16;
und d hätte ich dann antatt zu 5 zu 4 gewählt.
dann teilt 16 2^4=16.
-
AlexXXx schrieb:
Ich habe mal "m = 2a*5b" durch "m = 2x*5y" ersetzt da b bereits 10 ist.
In der Tat, da hatte ich Buchstaben doppelt verwendet.
m = 16 = 2^x * 5^y <=> x = 4 und y = 0
Das kleinste d ist dann max(x,y) = 4 => b^d = 10^4 = 10000
(und nicht 10^max(x,y), solche Dreher kommen vor wenn man seine Variablen nicht genau definiert.)AlexXXx schrieb:
Kann ich für
Ben04 schrieb:
to_hex((((a*10+b)*10+c)*10+d - '0'*1111)&31)
Auch
to_hex((((a*10+b)*10+c)*10+d - '0'*1111)&0x0F)
schreiben?? Oder brauche ich das eine Bit noch ??
Du musst sogar 0x0F schreiben. Da hab ich mich verrechnet.
AlexXXx schrieb:
-Könnte man f(x,y) als Funktional auffassen, und die Euler-Lagrangschen Glichungen darauf anwenden (Schwache Lösung) f(x,y(x),y'(x)) ??
-Gibt es einen Zusammenhang zwischen der schwachen Lösung und Fourier/Laplace-Transformation ??
(Zum Beispiel daß man die Ableitung in der Euler-Lagrangschen Gleichung durch
die Multiplikaiton mit der reellen Exponentialfunktion oder der komplexen Exponentialfunktion ersetzt??)Da schießt du über mein Wissen hinaus.