我有一个数字存储为最多16个字符(0到F)的字符串。这需要递增,结果存储为字符串。
最简单的事情是将字符串转换为int,递增1,然后转换回字符串。但是,操作系统不支持64个数字。有什么替代方案?
我假设一个手工制作的解决方案可以使用两个32位整数,在这种情况下,这必须是一个常见的场景,但我找不到任何样板模板代码,用于在谷歌搜索后做这样的事情。
更新:抱歉 - 之前已经提到了 - 这是针对Brew MP C ++的 - 他们的转换库的API限制为32位。
长期试验似乎在硬件上执行通常会遇到基本的大时间问题,使其无法使用。
答案 0 :(得分:11)
您可以一次增加一位数。如果数字在'0'和'8'之间,只需添加一个;同样,如果它在'A'和'E'之间。如果是'9',则将其设置为'A'。如果它是'F',则将其设置为'0'并将下一个数字递增到左边。
答案 1 :(得分:3)
您的编译器不支持64位长?
您可以使用各种库来支持任意宽度整数,例如http://gmplib.org/
答案 2 :(得分:3)
包括<cstdint>
并使用int64_t
或uint64_t
。您甚至可以在32位计算机上使用它们。所有你需要一个现代编译器。
答案 3 :(得分:1)
这是@Mark在C ++中建议的解决方案:
template<typename Iter>
void increment(Iter begin, Iter end)
{
for (; begin != end; ++begin)
{
++*begin;
if (*begin == 'G')
{
*begin = '0';
continue;
}
if (*begin == ':')
{
*begin = 'A';
}
break;
}
}
请记住使用反向迭代器调用它,因此字符串从右向左递增:
int main()
{
std::string x = "123456789ABCDEFF";
increment(x.rbegin(), x.rend());
std::cout << x << std::endl;
x = "FFFFFFFFFFFFFFFF";
increment(x.rbegin(), x.rend());
std::cout << x << std::endl;
}
答案 4 :(得分:0)
这是我编写的一些C#(没有C ++编译器)手工移植的 - 所以你可能需要调整它。这适用于低/高类型结构。
struct VirtInt64
{
unsigned int Low;
unsigned int High;
};
void Increment(VirtInt64* a)
{
var newLow = a->Low + 1;
if (newLow < a->Low)
{
a->Low = 0;
a->High = a->High + 1;
}
else
{
a->Low = newLow;
}
}