如何std::bitset<128>
在 C++ 中实现增量?
因为位集是 128 位长,我不能简单地做
std::bitset<128> set = std::bitset<128>();
set = std::bitset<128>(set.to_ulong() + 1ULL);
如何std::bitset<128>
在 C++ 中实现增量?
因为位集是 128 位长,我不能简单地做
std::bitset<128> set = std::bitset<128>();
set = std::bitset<128>(set.to_ulong() + 1ULL);
我同意 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
。
上面代码的问题尤其在于这一行:
set = std::bitset<128>(set.to_ulong() + 1ULL);
Unsigned long [ulong] 在 C++ 中至少是 32 位类型,具体取决于 OS + 芯片组,因此在尝试将 128 位变量转换为这种类型时,您会产生一个小问题(没有实现更大的类型,即)。
一切都没有丢失。正如上面提到的@Oli Charlesworth,您可以使用 bigint 库,它们很丰富。我以前用过的一个不错的就在这里。
对于您在上面尝试执行的操作,您可以尝试在大整数库的上下文中替换 to_ulong() 函数,例如在位集上运行的 to_bigint() 函数。
希望这可以帮助。