Класс Biglnteger
Все примитивные целые типы имеют ограниченный диапазон значений. В целочисленной арифметике Java нет переполнения, целые числа приводятся по модулю, равному диапазону значений.
Для того чтобы было можно производить целочисленные вычисления с любой разрядностью, в состав Java API введен класс Biglnteger , хранящийся в пакете java.math . Этот класс расширяет класс Number , следовательно, в нем переопределены методы doubleValue(), floatValue(), intValue(), longValue() . Методы byteVaiue() и shortvalue() не переопределены, а прямо наследуются от класса Number .
Действия с объектами класса Biglnteger не приводят ни к переполнению, ни к приведению по модулю. Если результат операции велик, то число разрядов просто увеличивается. Числа хранятся в двоичной форме с дополнительным кодом.
Перед выполнением операции числа выравниваются по длине распространением знакового разряда.
Шесть конструкторов класса создают объект класса BigDecimai из строки символов (знака числа и цифр) или из массива байтов.
Две константы — ZERO и ONE — моделируют нуль и единицу в операциях с объектами класса Biglnteger .
Метод toByteArray() преобразует объект в массив байтов.
Большинство методов класса Biglnteger моделируют целочисленные операции и функции, возвращая объект класса Biglnteger :
- abs() — возвращает объект, содержащий абсолютное значение числа, хранящегося в данном объекте this ;
- add(x) — операция this + х ;
- and(x) — операция this & х ;
- andNot(x) — операция this & (~х) ;
- divide (x) — операция this / х ;
- divideAndRemainder(х) — возвращает массив из двух объектов класса Biglnteger , содержащих частное и остаток от деления this на х ;
- gcd(x) — наибольший общий делитель, абсолютных, значений объекта this и аргумента х ;
- mах(х) — наибольшее из значений объекта this и аргумента х ; min(x) — наименьшее из значений объекта this и аргумента х ; mod(x) — остаток от деления объекта this на аргумент метода х ;
- modinverse(x) — остаток от деления числа, обратного объекту this , на аргумент х ;
- modPow(n, m) — остаток от деления объекта this , возведенного в степень n , на m ;
- multiply (х) —операция this * х ;
- negate() — перемена знака числа, хранящегося в объекте;
- not() — операция ~this ;
- оr(х) — операция this | х ;
- pow(n) — операция возведения числа, хранящегося в объекте, в степень n ;
- remainder(х) —операция this % х ;
- shiftLeft (n) — операция this « n ;
- shiftRight (n) — операция this » n;
- signum() — функция sign (x) ;
- subtract (x) — операция this — x ;
- xor(x) — операция this ^ x .
В листинге 4.3 приведены примеры использования данных методов.
Листинг 4.3. Методы класса Biglnteger в программе BiglntegerTest
import Java.math.Biglnteger;
class BiglntegerTest{
public static void main(String[] args){
Biglnteger a = new Biglnteger(«99999999999999999») ;
Biglnteger b = new Biglnteger(«88888888888888888888»);
System.out.println(«bits in a = » + a.bitLength());
System.out.println(«bits in b = » + b.bitLengthO);
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));
Biglnteger[] r = a.divideAndRemainder(b);
System.out.println(«a / b: q = » + r[0] + «, r = » + r[l]);
System.out.println(«gcd(a, b) = » + a.gcd(b));
System.out.println(«max(a, b) = » + a.max(b));
System.out.printin(«min(a, b) = » + a.min(b));
System.out.println(«a mod b = » + a.mod(b));
System.out.println(«I/a mod b = » + a.modlnverse(b));
System.out.println(«алп 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(«а л 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(«а л b = » + a.xor(b));
}
}
Обратите внимание на то, что в программу листинга 4.3 надо импортировать пакет Java.math .