2013-05-26 4 views
4

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

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

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

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

Вы пытаетесь использовать битрейт для реализации большого целого? – Mysticial

+6

Если вам нужно поведение с большим целым числом, вам следует, вероятно, изучить библиотеки большого числа. –

+1

Вы можете сделать рябь-добавить. Это достаточно просто. Но я бы предложил найти библиотеку, если вам нужно поведение большого числа. Зачем изобретать колесо. –

ответ

4

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

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

+0

Мне никогда не нравилось, что языки C и C++ не поддерживают бит Carry, например, языки ассемблера. –

+0

Поскольку я не могу использовать библиотеку с большим целым числом, я принял это решение, которое выполняет эту работу. – pvorb

1

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

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

неподписанных долгое [ULONG], по меньшей мере, 32-битный тип в C++, в зависимости от ОС + набор микросхем, поэтому в пытающегося чтобы вставить 128-битную переменную в этот тип, вы создали небольшую проблему (без реализации более крупного типа, то есть).

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

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

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

+1

'unsigned long' есть ** как минимум ** 32 бит. –

+1

Отредактировано, спасибо за примечание. – Cobalt

+1

'unsigned long' не ограничивается 32 или 64 битами. Это ** не менее ** 32 бит. –

Смежные вопросы