std::string str_D="241563"; DEC in HEX std::string str_H="3AF96";



  • 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 bei

    Ben04 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.


Anmelden zum Antworten