Эммануэль Лонка ответ правильный. Но, по идее Маноджа Баника, я тоже хотел бы поделиться своей идеей.
Мой код делает то же самое, что и код Маноя Баника, более быстрым способом. Идея состоит в том, чтобы инициализировать буфер и поместить бит 1 в правильное местоположение. Я использовал оператор сдвига влево на 1 байт вместо shiftLeft
метода.
Вот мой код:
static BigInteger twoToThePower(BigInteger n){
BigInteger eight = BigInteger.valueOf(8);
BigInteger[] devideResult = n.divideAndRemainder(eight);
BigInteger bufferSize = devideResult[0].add(BigInteger.ONE);
int offset = devideResult[1].intValue();
byte[] buffer = new byte[bufferSize.intValueExact()];
buffer[0] = (byte)(1 << offset);
return new BigInteger(1,buffer);
}
Но все равно медленнее, чем BigInteger.pow
Затем я обнаружил, что у класса BigInteger
есть метод с именем setBit
. Он также принимает тип параметра int
как метод pow
. Использование этого метода быстрее, чем BigInteger.pow
.
Код может быть:
static BigInteger twoToThePower(BigInteger n){
return BigInteger.ZERO.setBit(n.intValueExact());
}
Класс BigInteger
также имеет метод с именем modPow
. Но для этого нужен еще один параметр. Это означает, что вы должны указать modulus
, и ваш результат должен быть меньше, чем этот modulus
. Я не делал тест производительности для modPow
, но думаю, что он должен быть медленнее, чем метод pow
.