1

一連の (符号なし) 整数を使用して単純な bignum クラスを書きたいと思います。足し算と引き算がどのように機能するかは大まかにわかりますが、割り算と掛け算は別の話です。32 ビット コンパイラは、int64 を 2 つの int32 に分割することで、64 ビットの int をエミュレートできることを知っています。そのための効率的な方法を探しています。

アセンブリではなく、C++ コードが必要です。速度は主要な関心事ではありませんが、アセンブルを使用しない最も効率的なソリューションは、常に優れています。

4

6 に答える 6

4

おそらく、これは出発点として機能する可能性があります。base-65,536 表現を使用して、最大 2,048 ビットの符号なし整数を実装します。これは、各桁が 16 ビットに収まることを意味し、結果に 32 ビットを使用するだけで (乗算の場合でも) オーバーフローを自明に検出できます。

ただし、これは C コードですが、C++ に移植するか、インスピレーションとして使用するのは簡単なはずです。これは私が得意とする種類のものではないため、速度よりも読みやすさを重視して最適化されています。:)

于 2012-01-05T12:24:55.603 に答える
1

コードが実行されているプロセッサよりも高精度のプロセッサをエミュレートするプロセスの背後にある考え方を説明する任意精度の算術演算を確認することをお勧めします。

于 2012-01-05T12:27:53.870 に答える
0

NUMERICAL RECIPES IN C++ というハードカバーの本を購入すると、20.6 ページの p916 から p925 までのページで探しているものが見つかります。

于 2015-04-17T12:22:20.947 に答える
0

を使用するだけで何が問題になっていlong longますか? これは、少なくとも 64 ビットであることが保証されています。それ以外の場合は、Knuth (vol. 2) で基本的なアルゴリズムを提供する必要があります。

于 2012-01-05T12:27:55.053 に答える
0

単純なバイト配列を使用します。整数のサイズは好きなように設定できます*。バイナリで操作し、エンディアンを考慮する必要があります(ビットは7-6-5-4-3-2-1-0-15-14-13になります...)

*RAMは限られています

于 2012-01-05T12:28:07.183 に答える
0

任意のサイズの場合は、GMPを試してみてください。何らかの理由でコンパイラに頼ることができない場合は、32 ビットでの 64 ビット演算でも機能するはずです。

于 2012-01-05T12:32:08.120 に答える