将大十六进制数转换为十进制数

Convert big hexadecimal to decimal numbers

我有一个很大的十六进制数,例如 CD4A0619FB0907BC00000(25!)或任何其他类似的数字。现在,仅使用标准 C/C++ 代码(没有像 Boost 这样的库),我想将这个数字转换为十进制数 15511210043330985984000000。不幸的是,它对于 64 位整数来说太大了(比如 long long)而且我也不想使用任何浮点数据类型。如果这是可能的,你怎么能做到这一点?

假设您不想使用任何可能符合您的描述的资源"libraries like Boost"。简单的答案是编写您自己的一个子集,只包含您需要的操作。 如果 32 个十六进制数字就足够了,那么最简单的方法就是创建您自己的 128 位无符号整数并为该 128 位整数编写一个除以 10 的函数(生成商和余数)。您真的不需要任何其他功能,除以 10 非常简单。将最多 32 个十六进制数字转换为 128 位 int 是微不足道的,并且从一系列除以 10 生成十进制输出是微不足道的。 如果您基本上想要无限大小,那么将十进制数表示为一串数字并编写一个例程将其乘以 16 并添加另一个数字可能会更简单。这永远不是有效的解决方案,只是可能更容易为您的目的和无限大小编码。

如果您不想使用外部库,那么您将不得不自己实现一个任意精度的整数类型。有关如何执行此操作的想法,请参阅 this question for ideas on how to do this. You will also need a function/constructor for converting hexadecimal strings to your new type. See this 问题。

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