Преобразование больших шестнадцатеричных в десятичные числа

У меня есть большое шестнадцатеричное число, например CD4A0619FB0907BC00000 (25!) Или любое другое число, подобное этому. Теперь, используя только стандартный код C / C ++ (нет таких библиотек, как Boost), я хочу преобразовать это число в десятичное число 15511210043330985984000000. К сожалению, оно слишком велико для 64-разрядного целого числа (например, long long) и я не хочу использовать любые типы данных с плавающей запятой. Если это вообще возможно, как вы можете это сделать?

0

Решение

Предполагая, что вы не хотите использовать какие-либо ресурсы, которые могут соответствовать вашему описанию «библиотеки, такие как Boost». Простой ответ — написать свое собственное подмножество, содержащее только необходимые операции.
Если 32 шестнадцатеричных цифр достаточно, то проще всего было бы создать свой собственный 128-битный беззнаковый тип int и кодировать функцию деления на 10 (производя коэффициент и остаток) для этого 128-битного типа int. Вам действительно не нужны никакие другие функции, и делить на 10 довольно просто. Преобразование до 32 шестнадцатеричных цифр в 128-битное int является тривиальным, а генерация десятичного вывода из серии деления на десять — тривиальной.
Если вам нужен практически неограниченный размер, то, вероятно, проще представить десятичное число в виде строки цифр и написать процедуру, умножив ее на 16 и добавив еще одну цифру. Это никогда не будет эффективным решением, скорее всего, будет проще кодировать для ваших целей и неограниченного размера.

1

Другие решения

vector<unsigned int> bin2dec(vector<unsigned int> binary)
{
vector<unsigned int> decimal;
bool all_zero = false;

// binary[i]: stores 8-bit of the nubmer.
// Ex. 258 = 0x102 => binary[0] = 0x2, binary[1] = 0x1.
while (!all_zero) {
all_zero = true;
for (int i = binary.size() - 1; i >= 0; i--) {
int q = binary[i] / 10;
int r = binary[i] % 10;

binary[i] = q;
if (i > 0) {
binary[i-1] += (r << 8);
} else {
decimal.insert(decimal.begin(), r);
}
if (q != 0) {
all_zero = false;
}
}
}
// each element stands for one digit of the decimal number.
// Ex. 258 => decimal[0] = 2, decimal[1] = 5, decimal[2] = 8.
return decimal;
}
1

Если вы не хотите использовать внешние библиотеки, вам придется самостоятельно реализовать целочисленный тип с произвольной точностью. Увидеть этот вопрос для идей о том, как это сделать. Вам также понадобится функция / конструктор для преобразования шестнадцатеричных строк в ваш новый тип. Увидеть этот вопрос для идей о том, как это сделать.

0