Преобразовать действительно большое число из двоичного в десятичное и распечатать его - PullRequest
5 голосов
/ 06 июня 2009

Я знаю, как преобразовать двоичный код в десятичный. Я знаю как минимум 2 метода: настольный и силовой; -)

Я хочу преобразовать двоичный код в десятичный и вывести это десятичное число. Более того, меня не интересует это "десятичное число"; Я хочу просто напечатать это.

Но, как я уже писал выше, я знаю только 2 метода преобразования двоичного числа в десятичное, и оба они требуют добавления. Итак, я вычисляю некоторое значение для 1 или 0 в двоичном виде и добавляю его к запомненному значению. Это тонкое место. У меня действительно очень большое число (1 и 64 нуля). При конвертации мне нужно поместить некоторый промежуточный результат в некоторую «переменную». В C у меня есть тип int, который составляет только 4 байта и не более 10 ^ 11.

Итак, у меня недостаточно памяти для хранения промежуточного результата при преобразовании из двоичного в десятичное. Как я уже писал выше, меня не интересует ТОЧЕСТВЕННАЯ десятичная дробь, я просто хочу напечатать результат. Но я не вижу других способов решить эту проблему ;-( Есть ли какое-либо решение «просто напечатать» из двоичного файла?

Или, может быть, я должен использовать что-то вроде BCD (Binary Coded Decimal) для промежуточного представления? Я действительно не хочу использовать это, потому что это не так кроссплатформенно (процессоры Intel имеют встроенную функцию, но для других мне нужно написать собственную реализацию).

Буду рад услышать ваши мысли. Спасибо за терпение.

Язык: C.

Ответы [ 5 ]

6 голосов
/ 07 июня 2009

Я настоятельно рекомендую использовать такую ​​библиотеку, как GMP (библиотека GNU multiprecision). Вы можете использовать тип данных mpz_t для больших целых чисел, различные процедуры импорта / экспорта , чтобы получить данные в mpz_t, а затем использовать mpz_out_str() для их печати. в базе 10.

4 голосов
/ 06 июня 2009

Самый большой стандартный тип интегральных данных - unsigned long long int - в моей системе (32-битный Linux на x86) он имеет диапазон 0 - 1,8 * 10 ^ 20, что вам недостаточно, поэтому вам нужно создать свой собственный тип struct или array) и написать базовую математику (в основном вам просто нужно добавить) для этого типа.

На вашем месте (а память не проблема), я бы использовал массив - один байт на десятичную цифру, а не BCD. BCD более компактен, поскольку в нем хранится 2 десятичных знака на байт, но вам нужно приложить гораздо больше усилий, работая с большими и низкими кусочками отдельно.

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

0 голосов
/ 07 июня 2009

Преобразование в десятичное действительно означает вычисление каждой степени десяти, так почему бы просто не сохранить их в массиве байтов? Тогда печать просто перебирает массив.

0 голосов
/ 06 июня 2009

Что ж, при преобразовании из двоичной системы в десятичную, вам действительно не нужны ВСЕ двоичные биты одновременно. Вам просто нужны биты, для которых вы в данный момент рассчитываете мощность, и, вероятно, двойная переменная для хранения результатов. Вы можете поместить двоичное значение в массив, скажем, i [64], выполнить итерацию по нему, получить мощность в зависимости от его позиции и продолжать добавлять его в двойное число.

0 голосов
/ 06 июня 2009

Не могли бы вы выделить память, скажем, для 5 int, и сохранить свой номер в начале массива? Затем вручную переберите массив в виде фрагментов типа int. Возможно что-то вроде:

int* big = new int[5];
*big = <my big number>;
...