サーチ…


前書き

BigIntegerクラスは、プリミティブデータ型には大きすぎる大きな整数を含む数学演算に使用されます。たとえば、100階乗は158桁です。これは、 longよりもはるかに大きくなります。 BigIntegerは、Javaのプリミティブ整数演算子のすべて、およびjava.lang.Mathからの関連するすべてのメソッド、および他のほとんどの操作に類似したものを提供しjava.lang.Math

構文

  • BigInteger variable_name =新しいBigInteger( "12345678901234567890"); //文字列としての10進整数
  • BigInteger variable_name = new BigInteger( "1010101101010100101010011000110011101011000111110000101011010010"、2)//文字列としての2進整数
  • BigInteger variable_name = new BigInteger( "ab54a98ceb1f0800"、16)//文字列としての16進整数
  • BigInteger variable_name =新しいBigInteger(64、新しいランダム()); // 64ビットを供給して整数を構成する擬似乱数生成器
  • BigInteger variable_name = new BigInteger(新しいバイト[] {0、-85、84、-87、-116、-21、31、10、-46}); //整数の符号付き2の補数表現(ビッグエンディアン)
  • BigInteger variable_name = new BigInteger(1、新しいバイト[] { - 85,84、-87、-116、-21、31、10、-46}); //正の整数の符号なし2の補数表現(ビッグエンディアン)

備考

BigIntegerは不変です。したがって、その状態を変更することはできません。たとえば、不変性のためにsumが更新されないため、以下は動作しません。

BigInteger sum = BigInteger.ZERO;
for(int i = 1; i < 5000; i++) {
   sum.add(BigInteger.valueOf(i));  
}

結果をsum変数に代入して、動作させます。

sum = sum.add(BigInteger.valueOf(i));

Java SE 8

BigIntegerの公式文書によると、 BigInteger実装では、-2 2147483647と2 2147483647の間のすべての整数がサポートされるはずです。つまり、 BigIntegerのビット数は20億を超えることができます!

初期化

java.math.BigIntegerクラスは、Javaのすべてのプリミティブ整数演算子と、 java.lang.Math関連するすべてのメソッドに対して類似の演算を提供しjava.lang.Mathjava.mathパッケージは自動的に利用できないため、単純なクラス名を使用する前にjava.math.BigIntegerをインポートする必要があります。

longまたはint値をBigInteger変換するには、次のようにします。

long longValue = Long.MAX_VALUE;
BigInteger valueFromLong = BigInteger.valueOf(longValue); 

または、整数の場合:

int intValue = Integer.MIN_VALUE; // negative
BigInteger valueFromInt = BigInteger.valueOf(intValue);

これ広げるであろうintValue負の値は負とどまるように、負の値の符号ビット拡張を使用して、長尺の整数です。


数値のStringBigInteger変換するには:

String decimalString = "-1";
BigInteger valueFromDecimalString = new BigInteger(decimalString);

次のコンストラクタは、の文字列表現に変換するために使用されBigIntegerに指定された基数でのBigInteger

String binaryString = "10";
int binaryRadix = 2;
BigInteger valueFromBinaryString = new BigInteger(binaryString , binaryRadix);

Javaでは、 BigIntegerインスタンスへのバイトの直接変換もサポートされています。現在は、符号付きおよび符号なしのビッグエンディアンエンコーディングのみが使用できます。

byte[] bytes = new byte[] { (byte) 0x80 }; 
BigInteger valueFromBytes = new BigInteger(bytes);

これにより、最初のビットが符号ビットとして解釈されるため、値-128のBigIntegerインスタンスが生成されます。

byte[] unsignedBytes = new byte[] { (byte) 0x80 };
int sign = 1; // positive
BigInteger valueFromUnsignedBytes = new BigInteger(sign, unsignedBytes);

これは、バイトが符号なし数値として解釈され、符号が明示的に1の正の数に設定されるため、値が128のBigIntegerインスタンスを生成します。


共通の値にはあらかじめ定義された定数があります。

  • BigInteger.ZERO - 値が「0」です。
  • BigInteger.ONE - 値が「1」です。
  • BigInteger.TEN - 値が「10」です。

BigInteger.TWO (値 "2")もありますが、 privateためコードで使用することはできません。

BigIntegersの比較

BigIntegersは、JavaのStringや他のオブジェクトと比較するのと同じものを比較できます。

例えば:

BigInteger one = BigInteger.valueOf(1);
BigInteger two = BigInteger.valueOf(2);

if(one.equals(two)){
    System.out.println("Equal");
}
else{
    System.out.println("Not Equal");
}

出力:

Not Equal

注意:

一般に、BigIntegersを比較するために==演算子を使用しないでください

  • ==演算子:参照を比較します。つまり、2つの値が同じオブジェクトを参照しているかどうか
  • equals()メソッド:2つのBigIntegerの内容を比較します。

たとえば、BigIntegersは次のように比較しないでください。

if (firstBigInteger == secondBigInteger) {
  // Only checks for reference equality, not content equality!
}

==演算子が参照平等のみをチェックするので、予期しない動作につながる可能性があります。両方のBigIntegerに同じコンテンツが含まれていて、同じオブジェクトを参照していない場合、 これは失敗します。代わりに、上で説明したように、 equalsメソッドを使用してBigIntegersを比較します。

BigIntegerと0,1,10のような定数を比較することもできます。

例えば:

BigInteger reallyBig = BigInteger.valueOf(1);
if(BigInteger.ONE.equals(reallyBig)){
    //code when they are equal.
}    

次のように、 compareTo()メソッドを使用して2つのBigIntegerを比較することもできますcompareTo()は3つの値を返します。

  • 0:両方が等しい場合
  • 1:最初の値が 2番目の値よりも大きい場合 (括弧内の値)。
  • -1:最初のものが2番目のものよりも小さいとき。
BigInteger reallyBig = BigInteger.valueOf(10);
BigInteger reallyBig1 = BigInteger.valueOf(100);

if(reallyBig.compareTo(reallyBig1) == 0){
    //code when both are equal.
}
else if(reallyBig.compareTo(reallyBig1) == 1){
    //code when reallyBig is greater than reallyBig1.
}
else if(reallyBig.compareTo(reallyBig1) == -1){
    //code when reallyBig is less than reallyBig1.
}

BigIntegerの数学演算の例

BigIntegerは不変オブジェクトであるため、任意の数学演算の結果を新しいBigIntegerインスタンスに割り当てる必要があります。

加算: 10 + 10 = 20

BigInteger value1 = new BigInteger("10");
BigInteger value2 = new BigInteger("10");

BigInteger sum = value1.add(value2);
System.out.println(sum);

出力:20

除算: 10 - 9 = 1

BigInteger value1 = new BigInteger("10");
BigInteger value2 = new BigInteger("9");

BigInteger sub = value1.subtract(value2);
System.out.println(sub);

出力:1

部門: 10/5 = 2

BigInteger value1 = new BigInteger("10");
BigInteger value2 = new BigInteger("5");

BigInteger div = value1.divide(value2);
System.out.println(div);

出力:2

部門: 17/4 = 4

BigInteger value1 = new BigInteger("17");
BigInteger value2 = new BigInteger("4");

BigInteger div = value1.divide(value2);
System.out.println(div);

出力:4

乗算: 10 * 5 = 50

BigInteger value1 = new BigInteger("10");
BigInteger value2 = new BigInteger("5");

BigInteger mul = value1.multiply(value2);
System.out.println(mul);

出力:50

電力: 10 ^ 3 = 1000

BigInteger value1 = new BigInteger("10");
BigInteger power = value1.pow(3);
System.out.println(power);

出力:1000

残り: 10%6 = 4

BigInteger value1 = new BigInteger("10");
BigInteger value2 = new BigInteger("6");

BigInteger power = value1.remainder(value2);
System.out.println(power);

出力:4

GCD: 1218最大公約数(GCD)は6です。

BigInteger value1 = new BigInteger("12");
BigInteger value2 = new BigInteger("18");

System.out.println(value1.gcd(value2));

出力:6

最大 2つのBigInteger:

BigInteger value1 = new BigInteger("10");
BigInteger value2 = new BigInteger("11");

System.out.println(value1.max(value2));

出力:11

最低 2つのBigInteger:

BigInteger value1 = new BigInteger("10");
BigInteger value2 = new BigInteger("11");

System.out.println(value1.min(value2));

出力:10

BigIntegerのバイナリロジック演算

BigIntegerはNumber型でも使用できるバイナリロジック演算をサポートしています。すべての操作と同様に、メソッドを呼び出すことで実装されます。

バイナリまたは:

BigInteger val1 = new BigInteger("10");
BigInteger val2 = new BigInteger("9");

val1.or(val2);

出力:11(これは10 | 9相当)

バイナリと:

BigInteger val1 = new BigInteger("10");
BigInteger val2 = new BigInteger("9");

val1.and(val2);

出力:8( 10 & 9相当)

バイナリXOR:

BigInteger val1 = new BigInteger("10");
BigInteger val2 = new BigInteger("9");

val1.xor(val2);

出力:3( 10 ^ 9相当)

RightShift:

BigInteger val1 = new BigInteger("10");

val1.shiftRight(1);   // the argument be an Integer    

出力:5( 10 >> 1相当)

左方移動:

BigInteger val1 = new BigInteger("10");

val1.shiftLeft(1);   // here parameter should be Integer    

出力:20( 10 << 1相当)

バイナリ反転(Not):

BigInteger val1 = new BigInteger("10");

val1.not();

出力:5

NAND(And-Not): *

BigInteger val1 = new BigInteger("10");
BigInteger val2 = new BigInteger("9");

val1.andNot(val2);

出力:7

ランダムBigIntegersの生成

BigIntegerクラスには、 java.util.RandomインスタンスとBigInteger持つビット数を指定するintを与えられたランダムBigIntegersを生成する専用のコンストラクタがあります。その使い方は非常に簡単です。次のようにBigInteger(int, Random)コンストラクタを呼び出すと、

BigInteger randomBigInt = new BigInteger(bitCount, sourceOfRandomness);

値が0(両端を含む)から2 bitCount (これを含まない)までのBigIntegerます。

これは、 new BigInteger(2147483647, sourceOfRandomness)new BigInteger(2147483647, sourceOfRandomness)十分な時間が与えられたすべての正のBigInteger返すこともあることを意味します。


sourceOfRandomnessはあなた次第です。たとえば、 new Random()はほとんどの場合十分です:

new BigInteger(32, new Random());

高品質の乱数の速度をあきらめたい場合は、代わりにnew SecureRandom ()使うことができます:

import java.security.SecureRandom;

// somewhere in the code...
new BigInteger(32, new SecureRandom());

匿名クラスでオンザフライでアルゴリズムを実装することもできます! ロールアウト独自のRNGアルゴリズムはそういつもあなたがた場合を除き、まともであることが証明されたアルゴリズムを使用してください、 低品質のランダムであなたを終わることに注意てくださいBigInteger予測可能であることを(複数可)。

new BigInteger(32, new Random() {
    int seed = 0;

    @Override
    protected int next(int bits) {
        seed = ((22695477 * seed) + 1) & 2147483647; // Values shamelessly stolen from Wikipedia
        return seed;
    }
});


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow