Vector のビットワイズ操作
-
27-09-2019 - |
質問
ビットワイズ操作を実行するための最良の方法は何ですか vector<bool>
?
私が理解しているように、 vector<bool>
ブールアンドごとに1ビットを使用する専門化です。私が選んだ vector<bool>
メモリを節約する理由から。私はいくつかの問題があることを知っています vector<bool>
しかし、私のニーズのためにそれは適切です。
さて - そのようなベクトル全体にビットワイズ操作を整える最もパフォーマンスのある方法は何ですか?
ループでそれを行い、それぞれのブールを読み取り、それを保存してから格納すると、実際の値にアクセスするために、より多くの操作が内部で実行されます。
ありがとう!
解決
ビット数がコンパイル時間に固定されている場合、使用する方がずっと良いでしょう std::bitset
そうでない場合、(つまり、ビット数は実行時に異なります)、あなたは見る必要があり、使用することができます boost::dynamic_bitset
)
これらの両方で、すべてのビットワイズ操作を実行することは非常に簡単です。
他のヒント
あなたの質問のタイトルを無視して、答えましょう これ 代わりに質問:
ベクトルでビットワイズ操作を実行する最良の方法は何ですか?
最良の方法は、ベクトルをとして定義することです vector<unsigned char>
(また vector<uint32_t>
, 、または選択した他の整数タイプ)、および署名されていない整数の配列に対して通常どのようにビットワイズ操作を行うか。物事はこの方法ではるかに高速になり、隠されたメカニズムはありません。
ディビジョン(または滑らかな場合は、ビットワイズ演算子)を使用して、操作する必要がある配列インデックスを解決し、単一の要素よりも大きいビットワイズ操作を適用するためにLoopsを使用できます。
関連する質問は次のとおりです。cでたくさんのビットをつけているビット
あなたは基本的にこれらの同じ操作を行うでしょう、あなたが包むことに決めたとき vector<unsigned some-int-type>
あなた自身のオペレーターと。
私はこれらの回答の両方を読みましたが、迅速な解決策を望んでいて、恐ろしいものを実装しました。
ビットワイズ演算子を動作させることができます vector<bool>
, 、しかし、コードはC ++標準ライブラリの実装に特化するか、遅いフォームに戻る必要があります。これが私です operator|
GNU libstdc ++-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を更新し、新しいバージョンは物事を異なって保存し、あなたのコードは明らかな理由もなく壊れます。
これです も機能するはずです。
std::vector<bool> v3(v1.size());
std::transform(v1.begin(), v1.end(),
v2.begin(), v3.begin(), std::logical_and<bool>());