Как достичь приращения на std::bitset<128>
в C++?Как я могу увеличить std :: bitset
Поскольку BitSet имеет длину 128 бит, я не могу просто сделать
std::bitset<128> set = std::bitset<128>();
set = std::bitset<128>(set.to_ulong() + 1ULL);
Как достичь приращения на std::bitset<128>
в C++?Как я могу увеличить std :: bitset
Поскольку BitSet имеет длину 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
для меня.
Мне никогда не нравилось, что языки C и C++ не поддерживают бит Carry, например, языки ассемблера. –
Поскольку я не могу использовать библиотеку с большим целым числом, я принял это решение, которое выполняет эту работу. – pvorb
Проблема с выше код в этой линии, в частности:
set = std::bitset<128>(set.to_ulong() + 1ULL);
неподписанных долгое [ULONG], по меньшей мере, 32-битный тип в C++, в зависимости от ОС + набор микросхем, поэтому в пытающегося чтобы вставить 128-битную переменную в этот тип, вы создали небольшую проблему (без реализации более крупного типа, то есть).
Все не потеряно. Как упоминал выше @Oli Charlesworth, вы можете использовать библиотеку bigint, и они многочисленны. Достойный, который я использовал раньше, - here.
Для того, что вы пытаетесь сделать выше, вы можете попробовать подобрать функцию to_ulong() в контексте большой целочисленной библиотеки, что-то вроде to_bigint(), которая работает на битете.
Надеюсь, это поможет.
'unsigned long' есть ** как минимум ** 32 бит. –
Отредактировано, спасибо за примечание. – Cobalt
'unsigned long' не ограничивается 32 или 64 битами. Это ** не менее ** 32 бит. –
Вы пытаетесь использовать битрейт для реализации большого целого? – Mysticial
Если вам нужно поведение с большим целым числом, вам следует, вероятно, изучить библиотеки большого числа. –
Вы можете сделать рябь-добавить. Это достаточно просто. Но я бы предложил найти библиотеку, если вам нужно поведение большого числа. Зачем изобретать колесо. –