Heim >Backend-Entwicklung >C++ >Wie erhalte ich die obere Hälfte einer 64-Bit-Ganzzahlmultiplikation in C?

Wie erhalte ich die obere Hälfte einer 64-Bit-Ganzzahlmultiplikation in C?

Susan Sarandon
Susan SarandonOriginal
2024-11-16 11:30:04574Durchsuche

How to Get the Upper Half of a 64-bit Integer Multiplication in C  ?

Ermitteln der oberen Hälfte der 64-Bit-Ganzzahlmultiplikation

In C ergibt die Multiplikation zweier 64-Bit-Ganzzahlen (uint64_t) Folgendes: ein Wert, der die unteren 64 Bits des Produkts darstellt, d. h. (i * j) mod (2^64). Um die oberen 64 Bits zu erhalten, können verschiedene Ansätze verwendet werden.

Verwendung von 128-Bit-Zahlen

Wenn Ihr Compiler 128-Bit-Ganzzahlen (__uint128_t) unterstützt, am meisten Ein effizienter Ansatz besteht darin, die Multiplikation mit 128-Bit-Arithmetik durchzuführen und die oberen 64 Bits zu extrahieren.

Portabler Ansatz für 64-Bit-Arithmetik

Für Compiler, die dies nicht unterstützen Bei 128-Bit-Zahlen besteht eine tragbare Lösung darin, jede 64-Bit-Ganzzahl in zwei 32-Bit-Hälften aufzuteilen und diese mithilfe der 64-Bit-Multiplikation zu multiplizieren. Die oberen und unteren Hälften werden dann kombiniert, um das vollständige 128-Bit-Produkt zu berechnen.

Diese Berechnung kann jedoch bei Verwendung der 64-Bit-Arithmetik zu Überläufen führen. Der folgende Code stellt eine Implementierung bereit, die Überläufe bei der Berechnung der oberen 64 Bits behandelt:

uint64_t mulhi(uint64_t a, uint64_t b) {
    uint64_t    a_lo = (uint32_t)a;
    uint64_t    a_hi = a >> 32;
    uint64_t    b_lo = (uint32_t)b;
    uint64_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;
    uint64_t    b_x_a_mid = b_hi * a_lo;
    uint64_t    a_x_b_lo =  a_lo * b_lo;

    uint64_t    carry_bit = ((uint64_t)(uint32_t)a_x_b_mid +
                             (uint64_t)(uint32_t)b_x_a_mid +
                             (a_x_b_lo >> 32) ) >> 32;

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

    return multhi;
}

Beachten Sie, dass das Weglassen der Berechnung von Carry_bit zu einem oberen 64-Bit-Wert führen würde, der um 1 abweichen kann.

Das obige ist der detaillierte Inhalt vonWie erhalte ich die obere Hälfte einer 64-Bit-Ganzzahlmultiplikation in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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