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

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

3 ответа

Решение

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

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; 
}

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

Другие вопросы по тегам