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

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

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-12 13:09:02826ブラウズ

How can you obtain the high part of a 64-bit integer multiplication in C  ?

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

C では、 i と j が 64 ビット符号なし整数の場合、 i * j はその積の下位 64 ビット、つまり (i * j) mod を生成します。 2^64。積の上位部分を取得するには、次のアプローチを検討してください。

128 ビット乗算の使用:

コンパイラが 128 ビット整数をサポートしている場合 (例: __uint128_t) )、128 ビット乗算を実行して上位 64 ビットを抽出すると、最も効率的な方法です。

YAK のアプローチ (32 ビット乗算を使用):

これには、各 64 ビット整数を 2 つの 32 ビットの半分に分割し、それらを乗算することが含まれます。 64 ビット乗算演算を使用し、結果:

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 multhi = a_hi * b_hi + (a_hi * b_lo >> 32) + (b_hi * a_lo >> 32) + a_lo * b_lo;

オーバーフローの処理:

ただし、上記の計算は 128 ビットの演算を実行するため、オーバーフローが発生する可能性があります。 64 ビット演算に制限されている場合にこれを処理するために、次の実装はオーバーフローを調整します。

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 = ((uint32_t)a_x_b_mid + (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;

注: 上位 64 ビットの 1 ビットのエラーが許容される場合、キャリービットの計算は省略可能です。

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

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