Класс BigInteger

We use cookies. Read the Privacy and Cookie Policy

Все примитивные целые типы имеют ограниченный диапазон значений. В целочисленной арифметике 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.4. Методы класса BigInteger в программе BigIntegerTest

Обратите внимание на то, что в программу листинга 4.6 надо импортировать пакет

j ava.math.