Класс BigInteger
Все примитивные целые типы имеют ограниченный диапазон значений. В целочисленной арифметике Java нет переполнения, целые числа приводятся по модулю, равному диапазону значений.
Для того чтобы было можно производить целочисленные вычисления с любой разрядностью, в состав Java API введен класс BigInteger, хранящийся в пакете java.math. Этот класс расширяет класс Number, следовательно, в нем переопределены методы
doubleValue(), floatValue(), intValue(), longValue(). Методы byteValue() и shortValue() не переопределены, а прямо наследуются от класса Number.
Действия с объектами класса BigInteger не приводят ни к переполнению, ни к приведению по модулю. Если результат операции велик, то число разрядов просто наращивается. Числа хранятся в двоичной форме с дополнительным кодом.
Перед выполнением операции числа выравниваются по длине распространением знакового разряда.
Шесть конструкторов класса создают объект класса BigInteger из строки символов (знака числа и цифр), массива байтов или задают случайное число. Чаще всего используются три конструктора:
? BigInteger(String value) — объект будет хранить большое целое число, заданное строкой цифр, перед которыми может стоять знак минус;
? BigInteger(String value, int radix) — задается строка цифр со знаком value, записанная в системе счисления с основанием radix;
? BigInteger(byte[] value) — объект будет хранить большое целое число, заданное массивом value, содержащим двоичное представление числа в дополнительном коде.
Три константы — zero, one и ten — моделируют нуль, единицу и число десять в операциях с объектами класса BigInteger.
Метод toByteArray() преобразует объект в массив байтов.
Большинство методов класса BigInteger моделируют целочисленные операции и функции, возвращая объект класса BigInteger:
? abs () — возвращает объект, содержащий абсолютное значение числа, хранящегося в данном объекте this;
? add (x) — операция сложения this + x;
? and(x) — операция побитовой конъюнкции this & x;
? andNot(x) — операция побитовой дизъюнкции с дополнением this & (~x);
? divide (x) — операция деления this / x;
? divideAndRemainder (x) - возвращает массив из двух объектов класса BigInteger, со
держащих частное и остаток от деления this на x;
? gcd(x) — наибольший общий делитель абсолютных значений объекта this и аргумента x;
? max(x) — наибольшее из значений объекта this и аргумента x;
? min(x) — наименьшее из значений объекта this и аргумента x;
? mod(x) — остаток от деления объекта this на аргумент метода x;
? modInverse (x) — остаток от деления числа, обратного объекту this, на аргумент x;
? modPow(n, m) — остаток от деления объекта this, возведенного в степень n, на m;
? multiply(x) — операция умножения this * x;
? negate () — перемена знака числа, хранящегося в объекте;
? not () — операция отрицания -this;
? or(x) — операция побитовой дизъюнкции this | x;
? pow(n) — операция возведения числа, хранящегося в объекте, в степень n;
? remainder(x) — операция взятия остатка от деления this % x;
? shiftLeft (n) — операция сдвига влево this << n;
? shiftRight (n) — операция арифметического сдвига вправо this >> n;
? signum() — функция sign(x);
? subtract (x) — операция вычитания this - x;
? xor(x ) — операция "исключающее ИЛИ" this л x.
В листинге 4.6 приведены примеры использования данных методов, а рис. 4.4 показывает результаты выполнения этого листинга.
Листинг 4.6. Методы класса BigInteger В Программе BiglntegerTest
import java.math.BigInteger; class BigIntegerTest{
public static void main(String[] args){
BigInteger a = new BigInteger("99999999999999999"); BigInteger b = new BigInteger("88888888888888888888"); System.out.println("bits in a = " + a.bitLength()); System.out.println("bits in b = " + b.bitLength()); System.out.println("a + b = " + a.add(b)); System.out.println("a & b = " + a.and(b)); System.out.println("a & ~b = " + a.andNot(b)); System.out.println("a / b = " + a.divide(b));
BigInteger[] r = a.divideAndRemainder(b);
System.out.println("a / b: q = " + r[0] + ", r = " + r[1]); System.out.println("gcd(a, b) = " + a.gcd(b)); System.out.println("max(a, b) = " + a.max(b)); System.out.println("min(a, b) = " + a.min(b)); System.out.println("a mod b = " + a.mod(b)); System.out.println("1/a mod b = " + a.modInverse(b)); System.out.println("aAn mod b = " + a.modPow(a, b));
System.out.println("a * b = " + a.multiply(b)); System.out.println("-a = " + a.negate()); System.out.println("~a = " + a.not()); System.out.println("a | b = " + a.or(b)); System.out.println("a л 3 = " + a.pow(3)); System.out.println("a % b = " + a.remainder(b)); System.out.println("a << 3 = " + a.shiftLeft(3)); System.out.println("a >> 3 = " + a.shiftRight(3)); System.out.println("sign(a) = " + a.signum()); System.out.println("a — b = " + a.subtract(b)); System.out.println("a л b = " + a.xor(b));
}
}
Обратите внимание на то, что в программу листинга 4.6 надо импортировать пакет
j ava.math.