ホームページ  >  記事  >  バックエンド開発  >  C で 64 ビット整数乗算の上半分を取得するにはどうすればよいですか?

C で 64 ビット整数乗算の上半分を取得するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-16 11:30:04513ブラウズ

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

64 ビット整数乗算の上位半分の取得

C では、2 つの 64 ビット整数 (uint64_t) の乗算の結果は次のようになります。積の下位 64 ビットを表す値、つまり (i * j) mod(2^64)。上位 64 ビットを取得するには、さまざまな方法を使用できます。

128 ビット数値の使用

コンパイラが 128 ビット整数 (__uint128_t) をサポートしている場合、最も効率的なアプローチは、128 ビット算術演算を使用して乗算を実行し、上位を抽出することです。 64 ビット。

64 ビット算術のための移植可能なアプローチ

128 ビット数値をサポートしないコンパイラの場合、移植可能な解決策は、各 64 ビット整数を分割することです。を 2 つの 32 ビットの半分に分割し、64 ビット乗算を使用して乗算します。次に、上位半分と下位半分が結合されて、完全な 128 ビットの積が計算されます。

ただし、64 ビット演算を使用すると、この計算でオーバーフローが発生する可能性があります。以下のコードは、上位 64 ビットの計算中にオーバーフローを処理する実装を提供します。

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;
}

carry_bit の計算を省略すると、上位 64 ビット値が 1 ずれる可能性があることに注意してください。

以上がC で 64 ビット整数乗算の上半分を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。