Heim > Backend-Entwicklung > C++ > Wie extrahiere ich die höherwertigen Bits einer 64-Bit-Ganzzahlmultiplikation in C?

Wie extrahiere ich die höherwertigen Bits einer 64-Bit-Ganzzahlmultiplikation in C?

Mary-Kate Olsen
Freigeben: 2024-11-19 06:33:02
Original
568 Leute haben es durchsucht

How to Extract the High-Order Bits of a 64-Bit Integer Multiplication in C  ?

Abrufen der höherwertigen Bits einer 64-Bit-Ganzzahlmultiplikation

In C das Multiplizieren zweier 64-Bit-Ganzzahlen ohne Vorzeichen (uint64_t) ergibt einen Wert, der die niederwertigen Bits der Multiplikation darstellt, wodurch das Ergebnis effektiv Modulo 2^64 ergibt. Dies wirft die Frage auf, wie man die höherwertigen Bits erhält, die oft für bestimmte Berechnungen notwendig sind.

Implementierungsansätze

  1. 128- Bitmultiplikation:

Wenn Ihr Compiler 128-Bit-Zahlen (__uint128_t) unterstützt, bietet die Durchführung einer 128-Bit-Multiplikation und das Extrahieren der oberen 64 Bits die effizienteste Möglichkeit, die höhere Ordnung zu erhalten Bits.

  1. 32-Bit-Multiplikation und 64-Bit-Akkumulation:

Wenn 128-Bit-Zahlen nicht unterstützt werden, eine tragbare und einfache Lösung besteht darin, jede 64-Bit-Zahl in zwei 32-Bit-Zahlen zu zerlegen, eine 32-Bit-Multiplikation mit ihnen durchzuführen und die 64-Bit-Partialprodukte sorgfältig zu akkumulieren, wobei darauf zu achten ist, dass Ganzzahlüberläufe vermieden werden.

Montageanweisungen:

Für einige Architekturen wie x86 gibt es spezielle Montageanweisungen (z. B. MULH), die für die Durchführung einer solchen 64-Bit-Ganzzahlmultiplikation entwickelt wurden. Die Verwendung dieser Anweisungen in C erfordert jedoch Kenntnisse in Assemblerprogrammierung und ist möglicherweise nicht so portabel wie die zuvor erwähnten C-Ansätze.

Beispielimplementierung:

Der folgende C-Code implementiert den 32-Bit-Multiplikations- und 64-Bit-Akkumulationsansatz:

uint64_t mulhi(uint64_t a, uint64_t b) {
  uint32_t a_lo = (uint32_t)a;
  uint32_t a_hi = a >> 32;
  uint32_t b_lo = (uint32_t)b;
  uint32_t b_hi = b >> 32;

  uint64_t a_x_b_hi = a_hi * b_hi;
  uint64_t a_x_b_mid = a_hi * b_lo + a_lo * b_hi; // Avoid overflow
  uint64_t b_x_a_mid = b_hi * a_lo;
  uint64_t a_x_b_lo = a_lo * b_lo;

  uint64_t multhi = a_x_b_hi +
                   (a_x_b_mid >> 32) + (b_x_a_mid >> 32) +
                   (a_x_b_lo >> 64);

  return multhi;
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie extrahiere ich die höherwertigen Bits einer 64-Bit-Ganzzahlmultiplikation in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage