什么是可扩展的算法,以手工打印的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)。
步骤1:定义包含在字符串格式的二的幂的查找表:
const char * const powers_of_two[] = {"1", "2", "4", "8", "16", "32", "64", ...};
第2步:编写一个函数,以字符串格式添加了两个数字。
第3步:通过您的比特数迭代,并添加所有对应1位的字符串。
第4步:打印结果。
我用这种方法我自己打印非常大的浮点数,它为我工作得很好。
一个基本递归算法用于输出十进制数:
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;
}
我已经离开未定义对于现在的辅助功能,也许这就够了。