18

に対してビット演算を実行する最良の方法は何vector<bool>ですか?

私が理解しているように、vector<bool>ブール値ごとに1ビットを使用する特殊化です。vector<bool>メモリ節約の理由で選択しました。いくつかの問題があることは知っていvector<bool>ますが、私のニーズには適切です。

今-そのようなベクトル全体にビット単位の操作を適用する最もパフォーマンスの高い方法は何ですか?

forループでそれを行い、各単一のboolを読み出して保存すると、実際の値にアクセスするために、内部でさらに多くの操作が実行されることがわかります。

ありがとう!

4

4 に答える 4

11

コンパイル時にビット数が固定されている場合は、std::bitset

そうでない場合 (つまり、実行時にビット数が変化する場合) を参照し、使用することができますboost::dynamic_bitset)

これらの両方で、すべてのビット単位の操作を行うのは非常に簡単です。

于 2010-10-29T03:44:51.850 に答える
4

あなたの質問のタイトルを無視して、代わりにこの質問に答えましょう:

ベクトルでビット演算を実行する最良の方法は何ですか?

最良の方法は、ベクトルをvector<unsigned char>(またはvector<uint32_t>、または選択した他の整数型) として定義し、符号なし整数の配列に対して通常行う方法でビット単位の操作を行うことです。この方法で物事ははるかに高速になり、隠されたメカニズムはなくなります。

除算 (巧妙な場合はビット単位の演算子) を使用して、操作する必要がある配列インデックスを解決し、for ループを使用して、1 つの要素よりも大きなビット単位の操作を適用できます。

関連する質問は次の とおりです。Cで多くのビットをいじるビット

vector<unsigned some-int-type>独自の演算子でラップする場合は、基本的にこれらと同じ操作を行います。

于 2010-10-29T03:30:43.817 に答える
3

私はこれらの答えを両方とも読みましたが、ただ迅速な解決策が欲しかったので、何か恐ろしいものを実装しました。

ビット演算子をで動作させることはできますvector<bool>が、コードはC ++標準ライブラリの実装に特化するか、低速形式にフォールバックする必要があります。operator|これがGNUlibstdc++-v3の私のものです:

std::vector<bool> operator|(std::vector<bool> A, const std::vector<bool>& B)
{
    if (A.size() != B.size())
        throw std::invalid_argument("differently sized bitwise operands");

    std::vector<bool>::iterator itA = A.begin();
    std::vector<bool>::const_iterator itB = B.begin();

    // c++ implementation-specific
    while (itA < A.end())
        *(itA._M_p ++) |= *(itB._M_p ++); // word-at-a-time bitwise operation

    return A;
}

もちろんこれはかなり悪いです。誰かがGCCを更新し、新しいバージョンは別の方法で保存し、明らかな理由もなくコードが壊れます。

于 2011-08-28T11:52:45.517 に答える
0

これもうまくいくはずです。

std::vector<bool> v3(v1.size());
std::transform(v1.begin(), v1.end(), 
               v2.begin(), v3.begin(), std::logical_and<bool>());
于 2012-03-25T03:26:48.123 に答える