8

std::bitset<128>C ++でaをインクリメントするにはどうすればよいですか?

ビットセットは 128 ビット長であるため、単純に行うことはできません。

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

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

2 に答える 2

6

私は 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されます。

于 2013-05-26T17:01:01.570 に答える
2

上記のコードの問題は、特に次の行にあります。

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

Unsigned long [ulong] は、OS + チップセットに応じて、C++ では少なくとも 32 ビット型であるため、128 ビット変数をこの型にキャストしようとすると、小さな問題が発生します (より大きなタイプ、つまり)。

すべてが失われるわけではありません。@Oli Charlesworth が前述したように、bigint ライブラリを使用できます。それらは豊富にあります。私が以前使っていたまともなものはここにあります。

上記でやろうとしていることについては、ビットセットで動作する to_bigint() のような大きな整数ライブラリのコンテキストで to_ulong() 関数をサブしてみてください。

お役に立てれば。

于 2013-05-26T17:04:00.543 に答える