57

Big Integer に関連するこのスタックオーバーフローの質問を調べましたが、具体的には次の行 (イタリック体の単語) がわかりません。

BigInteger クラスには制限がなく、便利な関数がいくつかありますが、美しいコードを BigInteger クラスで動作するように変換するのは非常に憂鬱です。特に、プリミティブ演算子がそこで機能せず、このクラスの関数を使用する必要がある場合はなおさらです。 .

何が欠けているのかわかりませんが、制限のないものを表現するには、無限のメモリが必要ですか? ここでのトリックは何ですか?

4

4 に答える 4

92

理論上の制限はありません。BigIntegerクラスは、保持するように要求されたデータのすべてのビットに必要なだけのメモリを割り当てます。

ただし、使用可能なメモリによって決定される実際的な制限がいくつかあります。影響を受ける可能性はほとんどありませんが、さらに技術的な制限があります。一部の方法では、ビットがintインデックスによってアドレス指定可能であると想定されているため、ビットを超えると問題が発生し始めInteger.MAX_VALUEます。

于 2012-08-23T09:18:23.713 に答える
18

グラハムはこの質問に素晴らしい答えを出しました。valueOfメソッドはパラメータを使用して作成されるlongため、最大値はですので、メソッドに注意する必要があることを付け加えておきますLong.MAX_VALUE

于 2012-08-23T09:25:06.787 に答える
6

はい、任意の精度で非常に大きな数が必要な場合に使用されます。「任意」の精度または桁数は「無制限」を意味しないことに注意することが重要です。つまり、計算の精度の数または桁数の桁数は、メモリおよび/または定義された精度の制限によって制限されます。指定します。

于 2012-08-23T09:31:13.520 に答える
3

BigInteger クラスのソース コードを見てください (NetBean で実行できます)。数値は int 配列として表されます。例、10113 は [1, 0, 1, 1, 3] になります (これは BigInteger クラスが正確に行うことではなく、big number モジュールがどのように機能するかの例にすぎません)。したがって、技術的には、その唯一の制限はメモリです。

于 2016-11-27T16:30:20.350 に答える