Frage

Wir tun etwas 32bit * 32-Bit-Multiplikation mit dem folgenden Algorithmus

Lassen Sie uns wollen wir ein (32 Bit) mit b multiplizieren (32 Bit), die beide signiert,

a = ah * 2 ^ 16 + al [ah - Höhere 16 Bits, al - Nieder 16 Bit]

b = bh * 2 ^ 16 + bl [bh - Höhere 16 Bits bl - Nieder 16 Bit]

Wir sind effektiv tun

Ergebnis = (al * bl) + (((ah * bl) + (bh al *)) * 2 ^ 16) + ((ah * bh) * 2 ^ 32) ~~~


Meine Frage,

Ist sie ein besserer Weg, dies zu tun?

War es hilfreich?

Lösung

In jedem Mainstream-Compiler, die Emulation von 64-Bit ints auf einem 32-Bit-Plattform wird etwa so effizient sein wie die Mutli-Schritt Mathe selbst zu tun. Aber es wird viel mehr zuverlässig korrekt ist.

Wenn mit Werten groß genug, um Überlauf einfache Arithmetik zu tun, auch die hohen Mathematik-Bibliothek abgestimmt, dass ich nur verwendet int64 gesehen habe.

Andere Tipps

Google "Karatsuba-Multiplikation".

OIH, und in Ihrem Code, ändern Sie die Konstante 2 ^ 15 (zweimal erscheint) bis 2 ^ 16.

Die Antwort nein ist, gibt es keine bessere Art und Weise, Dinge zu tun, abgesehen von Bit mit Verschiebung und Masken und anstelle von 2 ^ n. Nämlich:

a * 2^n <=> a << n

Zweitens sind Ihre Ints mit oder ohne Vorzeichen? Wenn sie dann unterzeichnet, dass Änderungen Dinge.

Drittens, ich bin nicht sicher, dass Ihr 2 ^ 15 richtig ist. Wenn es mindestens unsigned ist, möchten Sie Bits von 16: 15 verschieben.

Schließlich haben Sie in dem niederwertigen int für Integer-Überlauf zu achten. Addiert man Zahlen in der niederwertigen int, dass Überlauf es die Kapazität, die Sie brauchen, um richtig die hohe Ordnung int zu erhöhen.

Sie müssen wissen (bitte angeben), wie der 64-Bit-Wert gespeichert werden soll - vermutlich, es ist ein Paar von 32-Bit-Werten, möglicherweise zwei Elemente eines Arrays oder zwei Elemente einer Struktur. Sie müssen auch überlegen, wie die Vorzeicheninformation im Ergebnis gespeichert werden wird.

Mechanisch, mögen Sie wahrscheinlich beiden signierten Werte ohne Vorzeichen konvertieren, und dann die Spaltung tun und wieder zusammenbauen, entlang der Linien, die Sie zeigst, vorsichtig zu sein, um sicherzustellen, dass trägt von dem niederwertigen 32-Bit-Wert richtig in dem hohen Auftrag verwaltet 32-Bit-Wert.

Abhängig von Ihrer ursprünglichen Design-Entscheidungen, können Sie auch die Darstellung des Vorzeichens des Ergebnisses, und vielleicht sogar alle anderen Bits Fettle müssen.

Ähnliche Kommentare gelten für die Multiplikation zweier 16-Bit-Zahlen ohne 32-Bit-Ergebnisse, etwas, das einmal wichtig war, aber die meisten Menschen haben keine Sorgen zu machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top