たとえば、ボリューム割り当てビットマップを表すビット配列をC ++(Boostなし、標準コンテナーのみ)に格納するための最良の方法は何ですか?
std::vector<bool>
素晴らしいアイデアだと思いましたが、どうやらそれは邪悪で非推奨なので、より良い選択肢はありますか?
また:
メモリにバイト配列がある場合、推奨されるコンテナにそれらをコピーするにはどうすればよいですか?
(私はこれを理解するのに苦労していvector<bool>
ます。)
たとえば、ボリューム割り当てビットマップを表すビット配列をC ++(Boostなし、標準コンテナーのみ)に格納するための最良の方法は何ですか?
std::vector<bool>
素晴らしいアイデアだと思いましたが、どうやらそれは邪悪で非推奨なので、より良い選択肢はありますか?
メモリにバイト配列がある場合、推奨されるコンテナにそれらをコピーするにはどうすればよいですか?
(私はこれを理解するのに苦労していvector<bool>
ます。)
char配列と、0x1によるマスキングは、ビット配列として機能します。
例:
char bitarray[4]; // since 4*8 this array actually contains 32 bits
char getBit(int index) {
return (bitarray[index/8] >> 7-(index & 0x7)) & 0x1;
}
void setBit(int index, int value) {
bitarray[index/8] = bitarray[index/8] | (value & 0x1) << 7-(index & 0x7);
}
もちろん、これらの操作は通常比較的遅いですが、メモリが問題である場合、これは適切な方法です。必要なシフト数を減らすために、これにはcharを選択しました。ただし、整数の方が高速な場合があります。
バニラC++の場合、std::bitsetがあります。
ビットセットはベクトル(bit_vectorとも呼ばれます)と非常によく似ています。ビットのコレクションが含まれており、各ビットへの常時アクセスを提供します。ビットセットとベクトルの間には2つの主な違いがあります。まず、ビットセットのサイズは変更できません。ビットセットのビット数を指定するビットセットのテンプレートパラメータNは、整数定数である必要があります。第二に、ビットセットはシーケンスではありません。実際、これはSTLコンテナではありません。
Matt Austernには、その使用法に関するすばらしい記事があります。
また:バイト配列(ビット配列?)がunsigned longに収まる場合は、それをstd::bitsetに直接割り当てることができます。
unsigned long myByteArray = 0xABCD;
std::bitset<32> bitten( myByteArray );
後世のためにこれを投稿したばかりです。コメント投稿者の1人が言ったように、私はそれ自体の特殊なタイプとして使用するのはまったく問題ないという結論に達しました。std::vector<bool>
注意する必要があるのは、標準のコンテナのように扱わないことだけです。標準のbool
コンテナではないからです。
ビット配列が固定サイズである限り、std::bitsetで問題ありません。
補足として、std :: dynamic_bitsetもありますが、それが標準になったかどうかは100%確実ではありません。
ちなみに、あなたがリンクしているサイトで指摘されている点のいくつかは正しくないと思います。ほとんどすべてのコンピューターで、ビットのサイズは実際には1バイト(文字と同じ)です。コンピューターはバイト内のビットではなくバイトのみをアドレス指定できるためです(可能であれば、現在のアドレス空間の8分の1しかありません)。バイト付き)
あなたのコードを読む他の人々にあなたのアプリケーションのメモリフットプリントのより良い考えを与えるので、私はあなたのベクトルにバイトを使うでしょう。
Ramは最近のコンピューターでは非常に豊富であるため、より大きな整数型を使用できる場合がありますが、現実的には1バイトより小さくすることはできません。
あるコンテナから別のコンテナにデータをコピーするには、最初にコンテナのイテレータを作成します
vector :: iterator myItr = myVector.begin()
myItrがmyVector.end()に到達するまで、whileループまたはforループを使用してベクトルを反復処理します。
例えば
for(vector<bool>::iterator myItr = myVector.begin(); myItr<myVector.end(); ++myItr)
{
otherContainer.append(*myItr);
}
強力なC/С++ビット配列ライブラリ:https ://github.com/noporpoise/BitArray