Я пишу java-программу для вывода экспоненциальных степеней 2 (кстати, я не могу использовать Math.pow()
), однако при 2 ^ 31 и 2 ^ 32 я получаю что-то еще. Кроме того, я не намерен принимать отрицательные целые числа.
Мой код:
class PrintPowersOf2 {
public static void main (String[] args) {
printPowersOf2(10);
printPowersOf2(5);
printPowersOf2(2);
printPowersOf2(-5);
printPowersOf2(30);
printPowersOf2(32);
}
public static void printPowersOf2 (int x) {
for(int i=0;i<x+1;i++) {
int y = exponent (i);
System.out.print(y);
if(!(i == x)) {
System.out.print(" ");
}
}
System.out.println();
}
static int exponent(int power) {
int output = 1;
for (int z=0; z<power; z++)
output *= 2;
return output;
}
}
Выход, который я получаю:
1 2 4 8 16 32 64 128 256 512 1024
1 2 4 8 16 32
1 2 4
1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 33554432 67108864 134217728 268435456 536870912 1073741824
1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 33554432 67108864 134217728 268435456 536870912 1073741824 -2147483648 0
int
представлен 32 битами. Таким образом, может быть представлено любое значение между -2^31
и 2^31-1
. Ничего из этого диапазона.
Вы можете использовать long
(64 бит) или BigInteger
(структуры данных, которые могут отображать все числа до предела памяти).
Недостаток использования этих структур (особенно BigInteger
) заключается в том, что ЦП не всегда предлагает инструкции для арифметики. Таким образом, для добавления двух экземпляров BigInteger
требуется больше времени, чем при использовании int
или long
. В случае long
, если процессор 32-разрядный, для его обработки требуется как минимум две инструкции.
На боковой стенке. ЦП предлагает лучший способ вычислить полномочия двух операций: смены.
Вы можете просто написать:
long value = 0x01L << power;//power of two, all in one simple instruction.
Это работает следующим образом: сдвиг перемещает биты влево. Таким образом, если исходное значение:
0001 1011 << 2
= 0110 1100
Сдвиг влево в двоичном представлении арифметически совпадает с умножением на два.
В целом,
byte 8 bits, short 16 bits, int 32 bits, long 64 bits
Для Integer (int) вы можете сохранить значение между -2 ^ 31 и 2 ^ 31, т.е. Из -2, 147 483 648 до 2 147 483 647
Если вы действительно хотите вычислить степень 2 без каких-либо ограничений (по крайней мере, согласно теории), вы можете использовать строки и умножать соответственно.
Изменить:
Как и Commusoft, BigIntegers также может использоваться, что повышает производительность по сравнению с Strings.
BigInteger
, произвольной длины, но все же двоичное представление. Лучше, чем String
так как представление более компактно.
long
илиBigInteger
.