当操作系统仅支持32时,如何增加64位数?

时间:2011-08-23 18:45:29

标签: c++ 32bit-64bit

我有一个数字存储为最多16个字符(0到F)的字符串。这需要递增,结果存储为字符串。

最简单的事情是将字符串转换为int,递增1,然后转换回字符串。但是,操作系统不支持64个数字。有什么替代方案?

我假设一个手工制作的解决方案可以使用两个32位整数,在这种情况下,这必须是一个常见的场景,但我找不到任何样板模板代码,用于在谷歌搜索后做这样的事情。

更新:抱歉 - 之前已经提到了 - 这是针对Brew MP C ++的 - 他们的转换库的API限制为32位。

长期试验似乎在硬件上执行通常会遇到基本的大时间问题,使其无法使用。

5 个答案:

答案 0 :(得分:11)

您可以一次增加一位数。如果数字在'0'和'8'之间,只需添加一个;同样,如果它在'A'和'E'之间。如果是'9',则将其设置为'A'。如果它是'F',则将其设置为'0'并将下一个数字递增到左边。

答案 1 :(得分:3)

您的编译器不支持64位长?

您可以使用各种库来支持任意宽度整数,例如http://gmplib.org/

答案 2 :(得分:3)

包括<cstdint>并使用int64_tuint64_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;
    }
}