【问题标题】:manually printing a N-byte integer手动打印一个 N 字节整数
【发布时间】:2012-06-17 16:03:38
【问题描述】:

什么是可扩展的算法,可以手动打印其值不适合long long 的 N 位二进制整数。我知道printf 和朋友们,还有<iostream> (很可能是<cstdio> 的背驮式内置标准类型,但我想对由N 个字节组成的整数执行此操作。

我已经考虑过这一点并在 Google 上搜索了一下,但它总是归结为使用预先存在的 bigint 库,如 GMP(我完全不熟悉的代码库)或“使用 printf”或最有用的“this很难”。

整数基本上是:

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

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

【问题讨论】:

  • 我认为您需要以十进制打印数字?
  • @aix 是的,十进制是个好主意。
  • 我的建议是无论如何都要使用 bigint 库;这些库经过调试和验证。您将如何发现自己编码中的缺陷?这不像您要使用笔和纸或 Excel 来验证结果。
  • @tomdemuyt,例如在 Python 中生成大数的十进制和十六进制表示的测试用例是微不足道的。

标签: c++ printing integer arbitrary-precision


【解决方案1】:

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

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

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

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

第 4 步:打印结果。

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

【讨论】:

  • 你甚至不需要 2 的幂表:只需将数字加到自身乘以 2;如果位为 1,则数字加 1;重复 ==> 利润
  • 请注意,它仅适用于正数,尽管这很容易解决。太棒了。
  • 对于任意大的 N...
【解决方案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;
}

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

【讨论】:

  • 谢谢。我没有任何算术(我希望能够先看到结果),所以我会先尝试@Fred 的建议。我稍后可以比较这两种方法的性能。
猜你喜欢
  • 2012-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 2015-06-12
相关资源
最近更新 更多