手动打印N字节整数(manually printing a N-byte integer)

2019-09-18 03:07发布

什么是可扩展的算法,以手工打印的N二进制位整数,其值不适合在long long 。 我知道printf和朋友,随着<iostream>其中最有可能背负式上<cstdio>这个内置的标准类型,但我想这样做对的N个字节组成的整数。

我曾想过这一点,GOOGLE了一下,但它总是归结为使用像GMP一个预先存在的BIGINT libirary(代码库我一点都不熟悉)或“用printf”或最有用的“这很难” 。

整数基本上是:

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

所以重新诠释一个Integer<4>的字节会得到你的int32_t 。 我想扩展这N> 8。 效率是不是真的我此刻的关注。 无论是字节顺序(这是86)。

Answer 1:

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

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

第2步:编写一个函数,以字符串格式添加了两个数字。

第3步:通过您的比特数迭代,并添加所有对应1位的字符串。

第4步:打印结果。

我用这种方法我自己打印非常大的浮点数,它为我工作得很好。



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

我已经离开未定义对于现在的辅助功能,也许这就够了。



文章来源: manually printing a N-byte integer