Как я могу увеличить std :: bitset

Как я могу добиться увеличения на std::bitset<128> в С ++?

Поскольку длина набора составляет 128 бит, я не могу просто сделать

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

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

5

Решение

Я собираюсь согласиться с Оли и сказать, что если вы хотите делать вещи с большими целыми числами, то вам следует использовать большую целочисленную библиотеку.

Однако если вы действительно хочу сделать это с помощью 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 для меня.

4

Другие решения

Проблема с кодом выше, в частности, в этой строке:

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

Unsigned long [ulong] является как минимум 32-битным типом в C ++, в зависимости от набора микросхем OS +, поэтому при попытке преобразовать 128-битную переменную в этот тип вы создали небольшую проблему (без реализации больший тип, то есть).

Еще не все потеряно. Как упомянул @Oli Charlesworth выше, вы можете использовать библиотеку bigint, и их много. Достойный, который я использовал раньше Вот.

Для того, что вы пытаетесь сделать выше, вы можете попробовать добавить функцию to_ulong () в контексте большой целочисленной библиотеки, что-то вроде to_bigint (), которая работает с набором битов.

Надеюсь это поможет.

1