手动打印N字节整数

时间:2012-06-14 15:16:24

标签: c++ printing integer arbitrary-precision

什么是可伸缩算法来手动打印N二进制数字整数 ,其值不适合long long。我知道printf和朋友以及<iostream><cstdio>上最有可能背驮式的内置标准类型,但我想为一个由N个字节。

我已经考虑了这个并且用谷歌搜索了一下,但它总是归结为使用像GMP这样的预先存在的bigint图书馆(我根本不熟悉的代码库)或“使用printf”或者最有帮助的“这个很难“。

整数基本上是:

template<size_t N>
class Integer{
...
private:
    int8_t first;
    uint8_t rest[N-1];
}

所以重新解释一个Integer<4>的字节会得到int32_t。我想将其缩放到N> 8。目前效率并不是我真正关心的问题。也不是字节序(这是针对x86)。

2 个答案:

答案 0 :(得分:5)

步骤1:以字符串格式定义包含2的幂的查找表:

const char * const powers_of_two[] = {"1", "2", "4", "8", "16", "32", "64", ...};

步骤2:编写一个以字符串格式添加两个数字的函数。

步骤3:遍历数字中的位并添加与1位对应的所有字符串。

第4步:打印结果。

我自己使用这种方法来打印非常大的浮点数,它对我来说很好。

答案 1 :(得分:2)

输出十进制数的基本递归算法:

void negate(Integer & number); // modifies the input
int divide_by_10(Integer & number); // modifies the input
bool is_zero(const Integer & number);

void output_number(Integer number)
{
    if (number.first < 0)
    {
        cout << "-";
        negate(number);
    }
    if (is_zero(number))
    {
        cout << "0";
        return;
    }
    int remainder = divide_by_10(number);
    if (!is_zero(number))
        output_number(number);
    char digit[] = {'0', 0};
    digit[0] += remainder;
    cout << digit;
}

我暂时没有定义辅助函数,也许这就足够了。