Ich habe eine 128-Bit-Ganzzahl ohne Vorzeichen A und eine 64-Bit-Ganzzahl ohne Vorzeichen B. Wie kann ich am schnellsten berechnen? A % B
– das ist der (64-Bit) Rest aus der Division von A durch B?
Ich möchte dies entweder in C oder in der Assemblersprache tun, aber ich muss auf die 32-Bit-x86-Plattform abzielen. Dies bedeutet leider, dass ich weder die Compiler-Unterstützung für 128-Bit-Ganzzahlen noch die Fähigkeit der x64-Architektur nutzen kann, die erforderliche Operation in einer einzigen Anweisung auszuführen.
Bearbeiten:
Vielen Dank für die bisherigen Antworten. Es scheint mir jedoch, dass die vorgeschlagenen Algorithmen ziemlich langsam wären – wäre nicht der schnellste Weg, eine 128-Bit-mal-64-Bit-Division durchzuführen, die Nutzung der nativen Unterstützung des Prozessors für die 64-Bit-mal-32-Bit-Division? Weiß jemand, ob es eine Möglichkeit gibt, die größere Division in Bezug auf ein paar kleinere Divisionen durchzuführen?
Re: Wie oft ändert sich B?
In erster Linie interessiert mich eine allgemeine Lösung – welche Berechnung würden Sie durchführen, wenn A und B wahrscheinlich jedes Mal anders sind?
Eine zweite mögliche Situation ist jedoch, dass B nicht so oft variiert wie A – es können bis zu 200 As durch jedes B geteilt werden. Wie würde sich Ihre Antwort in diesem Fall unterscheiden?
Wie oft ändert sich B?
– Benutzer287792
4. April 2010 um 16:28 Uhr
Wie schnell muss funktionieren? Wie viele 128 mal 64 Modulo-Operationen pro Sekunde erwarten Sie?
– GJ.
10. April 2010 um 18:09 Uhr
Der Russian Peasant-Algorithmus ist einfach, verwendet jedoch Schleifen und nutzt die Divisionsanweisung in x86 nicht aus. Sie können den Algorithmus hier verwenden, es handelt sich um eine 64/32-Bit-Division durch 32/16-Bit-Dividierungsbefehl, aber Sie können ihn auf 128/64-Bit mal 64/32-Bit verdoppeln
– phuklv
29. Januar 2014 um 2:57 Uhr
Sollten Antworten ihren Code testen wollen, steht diese Wiki-Antwort zur Verfügung.
– chux – Wiedereinsetzung von Monica
22. September 2016 um 18:47 Uhr