Как представить число, которое длиннее, чем long, и распечатать его

#java #arrays #binary

#java #массивы #двоичный

Вопрос:

У меня есть массив int, в котором каждая его ячейка содержит число 0/1, массив представляет двоичное число. Я хочу напечатать представление десятичного числа массива. Для этого мне нужно преобразовать каждый бит в ячейке в виде 2 ^ n (n — номер ячейки) и суммировать все степени. Но с большими массивами сумма может превышать длинные границы. Я ищу решение без использования класса BigInteger / BigDecimal — это часть задания, которое я получил в университете.

Комментарии:

1. Затем вам нужно будет реализовать подобный класс BigInteger , который использует an int[] для хранения его значения. Но зачем тебе это делать?!!

2. и почему бы не использовать примитивный тип double ?

3. @Agus Потеря точности. В вопросе уже говорится, что существует более 63 бит (поскольку он превышает емкость long ), поэтому поддерживаемая 53 битами точность double хуже.

4. Вы могли бы представить результат в виде массива байтов, где каждый байт представляет собой (десятичную) цифру. Чтобы иметь возможность преобразовать последовательность единиц и нулей в десятичное число, вам потребуется всего две операции с этими данными: удвоить его (= добавить его к себе) и добавить к нему 1.

5. Массив байтов. Возможно, вы захотите выполнить поиск по «двоично-десятичной системе счисления», часто сокращаемой как BCD. Это часто использовалось для этой цели в старые времена вычислительной техники, когда программированием занимались такие динозавры, как я.

Ответ №1:

Я предлагаю вам использовать BitSet , инициализировать количество битов до длины вашего массива, выполнить итерацию по массиву, чтобы установить соответствующий бит, а затем получить результирующий массив байтов с toByteArray() помощью метода. Вы можете либо проанализировать результирующий массив байтов, либо передать его конструктору BigInteger.

Ответ №2:

Вам придется реализовать ручное сложение чисел произвольного размера.

В псевдокоде:

реализовать функцию сложения вручную add(a, b)

создайте переменные power2 = 1 и total = 0
цикл от младшего бита до старшего бита по массиву

  • если бит установлен, total = add(total, power2)
  • power2 = добавить (power2, power2)

общая сумма возврата

Ответ №3:

Как представить число длиннее, чем long, и распечатать его

Полномасштабное числовое представление (подобное BigInteger ) для этого не требуется.

Если все, что вы хотите сделать, это напечатать an int[] , содержащий нули и единицы, в виде двоичного числа, то самый простой способ — просто использовать a String для представления числа.

Вы могли бы построить его примерно так:

 StringBuilder sb = new StringBuilder(array.length);
for (int i: array) {
    sb.append(i == 0 ? "0" : "1");
}
String binary = sb.toString();
 

Обратите внимание, что приведенное выше более эффективно, чем:

 ....
    binary  = (i == 0 ? "0" : "1");
....
 

Это можно сделать более лаконично, используя Java 8 streams.


Я хочу напечатать представление десятичного числа массива.

Если это буквально то, что вы хотите сделать, то вам действительно нужна хотя бы ограниченная реализация «большого числа». (Достаточно выполнить повторное деление на 10.)

Однако на самом деле я не вижу смысла превращать то, что фактически является массивом битов (нулей и единиц), в число с основанием 10.


Для этого мне нужно преобразовать каждый бит в ячейке в виде 2 ^ n (n — номер ячейки) и суммировать все степени.

Я понятия не имею, что вы подразумеваете под «суммированием степеней», но я подозреваю, что это связано с тем, что вы думаете, что вам нужно десятичное числовое представление.

Комментарии:

1. Достаточно справедливо, но он пишет, что хочет распечатать представление десятичного числа

2. Ах, хорошо. Но давайте посмотрим, что говорит OP. (Поскольку печать десятичного представления не кажется особенно полезной вещью.) Я склонен думать, что OP не выразил себя четко и точно…