如何增加std :: bitset

时间:2013-05-26 16:49:14

标签: c++ biginteger bitset

如何在C ++中实现std::bitset<128>的增量?

因为bitset是128位长,所以我不能简单地做

std::bitset<128> set = std::bitset<128>();

set = std::bitset<128>(set.to_ulong() + 1ULL);

2 个答案:

答案 0 :(得分:5)

我会同意Oli,并说,如果你想做“大整数”的东西,那么你应该使用大整数库。

但是,如果确实希望使用std::bitset执行此操作,则您需要自己进行算术运算。

template <size_t N>
std::bitset<N> increment ( std::bitset<N> in ) {
//  add 1 to each value, and if it was 1 already, carry the 1 to the next.
    for ( size_t i = 0; i < N; ++i ) {
        if ( in[i] == 0 ) {  // There will be no carry
            in[i] = 1;
            break;
            }
        in[i] = 0;  // This entry was 1; set to zero and carry the 1
        }
    return in;
    }

int main () {
    std::bitset<32> foo;
    std::cout << foo.to_ulong () << ' ';
    foo = increment ( foo );
    std::cout << foo.to_ulong () << ' ';
    foo = increment ( foo );
    std::cout << foo.to_ulong () << ' ';
    foo = increment ( foo );
    std::cout << foo.to_ulong () << std::endl;

    return 0;
}

这为我打印0 1 2 3

答案 1 :(得分:2)

上面代码的问题特别在于这一行:

set = std::bitset<128>(set.to_ulong() + 1ULL);

无符号long [ulong]在C ++中至少是32位类型,具体取决于OS +芯片组,因此在尝试将128位变量转换为此类型时,您创建了一个小问题(没有更大类型的实现,即)。

一切都不会丢失。正如上面提到的@Oli Charlesworth,您可以使用bigint库,而且它们很丰富。我之前使用的一个体面的是here

对于您上面尝试做的事情,您可以尝试在大整数库的上下文中对to_ulong()函数进行子操作,例如to_bigint(),它在bitset上运行。

希望这有帮助。