Immer der hohe Teil des 64-bit-integer-Multiplikation

In C++, sagen, dass:

uint64_t i;
uint64_t j;

dann i * j wird der Ertrag einer uint64_t hat als Wert den unteren Teil der Multiplikation zwischen i und j, d.h., (i * j) mod 2^64.
Nun, was ist, wenn ich wollte, dass der höhere Teil der Multiplikation? Ich weiß, dass es existiert eine Montageanleitung tun, um so etwas wie, dass bei der Verwendung von 32-bit-Ganzzahlen, aber ich bin überhaupt nicht vertraut mit der Montage, also war ich auf Hilfe hoffend.

Was ist der effizienteste Weg, um so etwas wie:

uint64_t k = mulhi(i, j);
  • Verweis: blogs.msdn.com/b/oldnewthing/archive/2014/12/08/10578956.aspx
  • GCC hat uint128_t für diesen Zweck. Visual Studio hat keine solche option, obwohl.
  • Sieht aus wie uint128_t nicht vorhanden sind, unter meiner Umgebung (ich bin mit Xcode unter osx). Darüber hinaus wird explizit berechnen Sie den oberen und unteren Teil der Multiplikation, die ich gerne vermeiden möchte.
  • vielen Dank für den Verweis! Wie gesagt, ich habe wenig bis keine Erfahrung mit der Montage. Könnten Sie ein einfaches Beispiel-code, das tun, was ich brauche? Sorry, ich sollte auf jeden Fall studieren Versammlung ein für alle mal!
  • Es ist nicht möglich zu berechnen höheren Teil ohne untere Teil, da das tragen von unteren Teil vermehrt in den höher gelegenen Teil.
  • Es geht nicht um die Montage. Ich versuche nur, Ihnen zu zeigen, die Mathematik.
  • das stimmt in der Tat. Danke.
  • Wenn die Leistung nicht ein großes Anliegen sein, versuchen Sie, eine beliebige Länge integer-Klasse, um das Ergebnis zu erhalten.
  • Leistung ist meine größte Sorge, eigentlich...
  • Also, wenn ich die Migration auf eine Plattform, wo ich uint128_t das ist wahrscheinlich der effizienteste Weg, das zu tun, was ich brauche?
  • Wenn die Leistung ist die eigentliche Sorge. Sie müssen lernen, genug assembly code diese inline. Auf einem 64-bit-Prozessor, es werden (sollten? ) werden Anweisungen zum multiplizieren der oberen und unteren 32 bit-zahlen.
  • stackoverflow.com/questions/25095741/... stackoverflow.com/questions/28766755/... stackoverflow.com/questions/87771/... stackoverflow.com/questions/28807341/...
  • Es ist __int128 im gcc sowie llvm-einschließlich Apple-Tang Clan. stackoverflow.com/questions/13187629/...
  • Einige mehr high-bits von long-Multiplikation in Java? Computing hohe 64 bits einer 64x64 int Produkt in C Einigermaßen tragbaren Weg, um top-64-bit aus 64x64 bit multiplizieren? Pure-high-bit-Multiplikation in Assembler?
  • danke, ich denke, ich werde einfach verwenden Sie 128-bit-Multiplikation an dieser Stelle. Das klingt mehr Leistung als jede andere Lösung, die ich umsetzen konnte, die auf meinen eigenen, da ich vermute, dass jede mögliche Optimierung muss bereits umgesetzt worden, die von jenen entwickelt, die den compiler.
  • Diese Frage ist nicht ein Duplikat des einen verbunden. Dass die andere Frage ist die Fokussierung auf 32-bit-Multiplikationen, während dieser ist die Fokussierung auf 64-bit-Multiplikationen. Wenn die Leute kommen zu dieser Frage, die Sie Folgen Sie dem link (wie ich) und gehen Sie zurück zu dieser Frage. Ich denke, es sollte wieder aufgenommen werden (und vielleicht wieder geschlossen, mit einem besseren dup).
  • es sollte kein Unterschied sein. Doppelklicken Sie einfach jede variable Typ, und das problem ist gelöst
  • aber ja, ist wohl die andere Frage nicht gut genug generische Antwort
  • Sie können nicht verdoppeln, die variable Typen als leicht. Sie müssten eine 128-bit-integer-Typ.
  • Nein, Sie brauchen es nicht nur um den höheren Teil einer 64x64-Multiplikation, z.B. verbreitern der Montageanleitung, die andere Frage und du bist gut zu gehen. Und hast du meine verlinkte andere Fragen?
  • Dies ist eine C++ Frage, keine Montage-Frage. Natürlich kann ich eine Lösung finden, die in der Montage die Multiplikation von zwei 64-bit-Register. Der springende Punkt ist, zu wissen, ob dies möglich ist portabel in C++. Und wenn Sie stecken in portable C++, 32-bit-Frage eine triviale Antwort (multiplizieren von zwei std::uint64_t) und die 64-bit-Frage ist schwierig (denn wir haben nicht ein std::uint128_t)
  • Lassen Sie uns weiter, diese Diskussion im chat.
  • Ein besseres dupe ist Computing-hoch 64 bits einer 64x64 int Produkt in C und hat Antwort, die deutlich zeigt, wie derive gute Ergebnisse für ähnliche Probleme.

InformationsquelleAutor Matteo Monti | 2015-03-05
Schreibe einen Kommentar