Sök…


Introduktion

BigInteger används för matematiska operationer som involverar stora heltal med för stora storlekar för primitiva datatyper. Till exempel är 100-factorial 158 siffror - mycket större än en long kan representera. BigInteger tillhandahåller analoger till alla Java: s primitiva heltaloperatörer och alla relevanta metoder från java.lang.Math samt få andra operationer.

Syntax

  • BigInteger variable_name = new BigInteger ("12345678901234567890"); // ett decimaltal som en sträng
  • BigInteger variable_name = new BigInteger ("1010101101010100101010011000110011101011000111110000101011010010", 2) // ett binärt heltal som en sträng
  • BigInteger variable_name = nytt BigInteger ("ab54a98ceb1f0800", 16) // ett hexadecimalt heltal som en sträng
  • BigInteger variable_name = new BigInteger (64, new Random ()); // en pseudorandomnummergenerator som tillhandahåller 64 bitar för att konstruera ett heltal
  • BigInteger variable_name = new BigInteger (ny byte [] {0, -85, 84, -87, -116, -21, 31, 10, -46}); // undertecknade två komplementrepresentation av ett heltal (big endian)
  • BigInteger variabelnamn = nytt BigInteger (1, ny byte [] {- 85, 84, -87, -116, -21, 31, 10, -46}); // osignerade två komplementrepresentation av ett positivt heltal (big endian)

Anmärkningar

BigInteger är oföränderligt. Därför kan du inte ändra dess tillstånd. Till exempel fungerar inte följande eftersom sum kommer att uppdateras på grund av oföränderlighet.

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

Tilldela resultatet till sum att det fungerar.

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

Java SE 8

Den officiella dokumentationen för BigInteger anger att BigInteger implementeringar bör stödja alla heltal mellan -2 2147483647 och 2 2147483647 (exklusivt). Detta betyder att BigInteger kan ha mer än 2 miljarder bitar!

initiering

java.math.BigInteger ger operationsanaloger till alla Java: s primitiva heltalsoperatörer och för alla relevanta metoder från java.lang.Math . Eftersom java.math paketet inte automatiskt görs tillgängligt kan du behöva importera java.math.BigInteger innan du kan använda det enkla klassnamnet.

För att konvertera long eller int värden till BigInteger använd:

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

eller för heltal:

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

vilket kommer att utvidga intValue heltalet till långt med hjälp av teckenbitförlängning för negativa värden, så att negativa värden kommer att förbli negativa.


För att konvertera en numerisk String till BigInteger använd:

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

Följande konstruktör används för att översätta BigInteger av ett BigInteger i den angivna radix till ett BigInteger .

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

Java stöder också direkt konvertering av byte till en instans av BigInteger . För närvarande får endast signerad och osignerad stor endian-kodning användas:

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

Detta genererar en BigInteger instans med värdet -128 eftersom den första biten tolkas som teckenbiten.

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

Detta kommer att generera en BigInteger instans med värdet 128 eftersom byte tolkas som osignerat nummer, och tecknet är uttryckligen inställt på 1, ett positivt tal.


Det finns fördefinierade konstanter för vanliga värden:

  • BigInteger.ZERO - värde på "0".
  • BigInteger.ONE - värdet på "1".
  • BigInteger.TEN - värdet på "10".

Det finns också BigInteger.TWO (värdet på "2"), men du kan inte använda det i din kod eftersom det är private .

Jämför BigIntegers

Du kan jämföra BigIntegers samma sätt som du jämför String eller andra objekt i Java.

Till exempel:

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

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

Produktion:

Not Equal

Notera:

Använd i allmänhet inte använd operatorn == att jämföra BigIntegers

  • == operatör: jämför referenser; dvs. om två värden avser samma objekt
  • equals() -metod: jämför innehållet i två BigIntegers.

Till exempel bör BigIntegers inte jämföras på följande sätt:

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

Om du gör det kan det leda till oväntat beteende, eftersom operatören == bara kontrollerar referenslikhet. Om båda BigIntegers innehåller samma innehåll, men inte hänvisar till samma objekt, kommer detta att misslyckas. Jämför istället BigIntegers med hjälp av equals metoder, som förklarats ovan.

Du kan också jämföra ditt BigInteger med konstanta värden som 0,1,10.

till exempel:

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

Du kan också jämföra två BigIntegers med compareTo() enligt följande: compareTo() ger 3 värden.

  • 0: När båda är lika .
  • 1: När den första är större än den andra (den inom parentes).
  • -1: När första är mindre än sekund.
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 matematiska exempel

BigInteger finns i ett immutable-objekt, så du måste tilldela resultaten av alla matematiska operationer till en ny BigInteger-instans.

Tillägg: 10 + 10 = 20

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

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

utgång: 20

Substraktion: 10 - 9 = 1

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

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

utgång: 1

Uppdelning: 10/5 = 2

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

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

utgång: 2

Uppdelning: 17/4 = 4

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

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

utgång: 4

Multiplikation: 10 * 5 = 50

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

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

utgång: 50

Effekt: 10 ^ 3 = 1000

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

utgång: 1000

Resten: 10% 6 = 4

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

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

utgång: 4

GCD: Greatest Common Divisor (GCD) för 12 och 18 är 6 .

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

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

Utgång: 6

Maximalt två BigIntegers:

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

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

Utgång: 11

Minst två BigIntegers:

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

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

Utgång: 10

Binära logikoperationer på BigInteger

BigInteger stöder de binära logikoperationerna som också är tillgängliga för Number . Som med alla operationer implementeras de genom att anropa en metod.

Binary Eller:

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

val1.or(val2);

Utgång: 11 (vilket motsvarar 10 | 9 )

Binary Och:

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

val1.and(val2);

Utgång: 8 (vilket motsvarar 10 & 9 )

Binary Xor:

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

val1.xor(val2);

Utgång: 3 (vilket motsvarar 10 ^ 9 )

RightShift:

BigInteger val1 = new BigInteger("10");

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

Utgång: 5 (motsvarande 10 >> 1 )

Vänster Shift:

BigInteger val1 = new BigInteger("10");

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

Utgång: 20 (motsvarande 10 << 1 )

Binär inversion (inte):

BigInteger val1 = new BigInteger("10");

val1.not();

Utgång: 5

NAND (And-Not): *

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

val1.andNot(val2);

Utgång: 7

Generera slumpmässiga BigIntegers

BigInteger har en konstruktör avsedd att generera slumpmässiga BigIntegers , givet en instans av java.util.Random och en int som anger hur många bitar som BigInteger har. Användningen är ganska enkel - när du ringer konstruktören BigInteger(int, Random) så här:

BigInteger randomBigInt = new BigInteger(bitCount, sourceOfRandomness);

då kommer du att få ett BigInteger vars värde är mellan 0 (inklusive) och 2 bitCount (exklusivt).

Detta innebär också att new BigInteger(2147483647, sourceOfRandomness) kan returnera alla positiva BigInteger s som ges tillräckligt med tid.


Vad kommer sourceOfRandomness vara är upp till dig. Till exempel är en new Random() tillräckligt bra i de flesta fall:

new BigInteger(32, new Random());

Om du är villig att ge upp hastigheten för slumpmässiga nummer med högre kvalitet kan du använda ett new SecureRandom () istället:

import java.security.SecureRandom;

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

Du kan till och med implementera en algoritm on-the-fly med en anonym klass! Observera att rullning av din egen RNG-algoritm kommer att sluta dig med slumpmässighet av låg kvalitet , så se alltid till att använda en algoritm som har visat sig vara anständig om du inte vill att de resulterande BigInteger (erna) ska vara förutsägbara.

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow