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

时间:2015-07-24 15:00:25

标签: c++ decimal bignum

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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; 
}

答案 2 :(得分:0)

如果您不想使用外部库,那么您必须自己实现仲裁精度整数类型。有关如何执行此操作的建议,请参阅this问题。您还需要一个函数/构造函数来将十六进制字符串转换为新类型。有关如何执行此操作的建议,请参阅this问题。