Java Language
BigInteger
Поиск…
Вступление
Класс BigInteger используется для математических операций с большими целыми числами с слишком большими величинами для примитивных типов данных. Например, 100-факториал составляет 158 цифр - намного больше, чем может представлять long . BigInteger предоставляет аналоги всем примитивным целочисленным операторам Java и всем соответствующим методам из java.lang.Math а также нескольким другим операциям.
Синтаксис
- BigInteger variable_name = new BigInteger ("12345678901234567890"); // десятичное целое в виде строки
- BigInteger variable_name = new BigInteger ("1010101101010100101010011000110011101011000111110000101011010010", 2) // двоичное целое в виде строки
- BigInteger variable_name = new BigInteger ("ab54a98ceb1f0800", 16) // шестнадцатеричное целое число в виде строки
- BigInteger variable_name = new BigInteger (64, new Random ()); // генератор псевдослучайных чисел, обеспечивающий 64 бита для построения целого числа
- BigInteger variable_name = new BigInteger (новый байт [] {0, -85, 84, -87, -116, -21, 31, 10, -46}); // подписали двухдополнительное представление целого (big endian)
- BigInteger variable_name = new BigInteger (1, новый байт [] {- 85, 84, -87, -116, -21, 31, 10, -46}); // Непрерывное представление целых чисел без знака (положительное целое число)
замечания
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));
В официальной документации BigInteger говорится, что реализации BigInteger должны поддерживать все целые числа от -2 2147483647 до 2 2147483647 (эксклюзивные). Это означает, что BigInteger s может иметь более 2 миллиардов бит!
инициализация
Класс java.math.BigInteger обеспечивает аналоги операций для всех примитивных целочисленных операторов Java и для всех соответствующих методов из java.lang.Math . Поскольку пакет java.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 до long, используя расширение бита знака для отрицательных значений, так что отрицательные значения останутся отрицательными.
Чтобы преобразовать числовую String в BigInteger используйте:
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);
Это будет генерировать экземпляр BigInteger со значением -128, поскольку первый бит интерпретируется как бит знака.
byte[] unsignedBytes = new byte[] { (byte) 0x80 };
int sign = 1; // positive
BigInteger valueFromUnsignedBytes = new BigInteger(sign, unsignedBytes);
Это будет генерировать экземпляр BigInteger со значением 128, поскольку байты интерпретируются как беззнаковое число, а знак явно установлен в 1, положительное число.
Существуют предопределенные константы для общих значений:
-
BigInteger.ZERO- значение «0». -
BigInteger.ONE- значение «1». -
BigInteger.TEN- значение «10».
Существует также BigInteger.TWO (значение «2»), но вы не можете использовать его в своем коде, потому что он является private .
Сравнение BigIntegers
Вы можете сравнить BigIntegers же, как вы сравниваете String или другие объекты в Java.
Например:
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
-
==operator: сравнивает ссылки; т.е. имеют ли два значения один и тот же объект - Метод
equals(): сравнивает содержимое двух BigIntegers.
Например, BigIntegers не следует сравнивать следующим образом:
if (firstBigInteger == secondBigInteger) {
// Only checks for reference equality, not content equality!
}
Это может привести к неожиданному поведению, поскольку оператор == проверяет только ссылочное равенство. Если оба BigIntegers содержат один и тот же контент, но не относятся к одному и тому же объекту, это не сработает. Вместо этого сравните BigIntegers, используя методы equals , как описано выше.
Вы также можете сравнить свой BigInteger с постоянными значениями, такими как 0,1,10.
например:
BigInteger reallyBig = BigInteger.valueOf(1);
if(BigInteger.ONE.equals(reallyBig)){
//code when they are equal.
}
Вы также можете сравнить два BigIntegers с помощью метода compareTo() , как compareTo() ниже: compareTo() возвращает 3 значения.
- 0: Когда оба равны .
- 1: Когда первое больше второго (одно в скобках).
- -1: Когда первое меньше секунды.
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: наибольший общий делитель (GCD) для 12 и 18 - 6 .
BigInteger value1 = new BigInteger("12");
BigInteger value2 = new BigInteger("18");
System.out.println(value1.gcd(value2));
Выход: 6
Максимум два BigIntegers:
BigInteger value1 = new BigInteger("10");
BigInteger value2 = new BigInteger("11");
System.out.println(value1.max(value2));
Выход: 11
Минимум двух BigIntegers:
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)
Binary 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)
Двоичная инверсия (нет):
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 имеет конструктор, предназначенный для генерации случайных BigIntegers , учитывая экземпляр java.util.Random и int который определяет, сколько бит будет иметь BigInteger . Его использование довольно просто - когда вы вызываете конструктор BigInteger(int, Random) следующим образом:
BigInteger randomBigInt = new BigInteger(bitCount, sourceOfRandomness);
то вы получите BigInteger , значение которого находится в bitCount от 0 (включительно) и до 2 bitCount (исключение).
Это также означает, что 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());
Вы даже можете реализовать алгоритм «на лету» с анонимным классом! Обратите внимание , что выкатывает свой собственный алгоритм ГСЧ закончится вас с низким качеством случайностью, поэтому всегда обязательно использовать алгоритм , который , как доказано , чтобы быть достойной , если вы не хотите, чтобы в результате 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;
}
});