Как я могу добиться увеличения на std::bitset<128>
в С ++?
Поскольку длина набора составляет 128 бит, я не могу просто сделать
std::bitset<128> set = std::bitset<128>();
set = std::bitset<128>(set.to_ulong() + 1ULL);
Я собираюсь согласиться с Оли и сказать, что если вы хотите делать вещи с большими целыми числами, то вам следует использовать большую целочисленную библиотеку.
Однако если вы действительно хочу сделать это с помощью 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] является как минимум 32-битным типом в C ++, в зависимости от набора микросхем OS +, поэтому при попытке преобразовать 128-битную переменную в этот тип вы создали небольшую проблему (без реализации больший тип, то есть).
Еще не все потеряно. Как упомянул @Oli Charlesworth выше, вы можете использовать библиотеку bigint, и их много. Достойный, который я использовал раньше Вот.
Для того, что вы пытаетесь сделать выше, вы можете попробовать добавить функцию to_ulong () в контексте большой целочисленной библиотеки, что-то вроде to_bigint (), которая работает с набором битов.
Надеюсь это поможет.