質問
アレイ(構造など)にビットを保存したいです。だから私は次の2つのアプローチのいずれかに従うことができます
アプローチ番号1(1)
struct BIT
{
int data : 1
};
int main()
{
BIT a[100];
return 0;
}
アプローチ番号2(2)
int main()
{
std::bitset<100> BITS;
return 0;
}
なぜ誰かが1より2を好むのでしょうか?
解決
NRに近づくため。 2は実際に100ビットのストレージを使用し、さらに非常にマイナーな(一定の)オーバーヘッドを使用していますが、NR。 1は通常、4バイトのストレージあたりを使用します Bit
構造。一般に、a struct
C ++標準ごとに少なくとも1つのバイトが大きいです。
#include <bitset>
#include <iostream>
struct Bit { int data : 1; };
int main()
{
Bit a[100];
std::bitset<100> b;
std::cout << sizeof(a) << "\n";
std::cout << sizeof(b) << "\n";
}
プリント
400
16
これから離れて、 bitset
多くの有用な操作で、ビットアレイを素敵なオブジェクト表現に包みます。
他のヒント
良い選択は、ビットをどのように使用するかによって異なります。
std::bitset<N>
固定サイズです。 Visual C ++ 10.0は、不適合WRTです。コンストラクターへ。一般に、回避策を提供する必要があります。これは皮肉なことに、マイクロソフトがバグフィックスだと思ったもののためでした - 彼らはコンストラクターを導入しました int
私が思い出すように、議論。
std::vector<bool>
とほぼ同じ方法で最適化されています std::bitset
. 。コスト:インデックス作成は参照を直接提供しません(C ++の個々のビットへの参照はありません)が、代わりにプロキシオブジェクトを返します。これは、参照として使用しようとするまで気付くものではありません。アドバンテージ:最小限のストレージ、および必要に応じてベクトルを変更できます。
単にEGを使用します unsigned
また、少数のビットを扱う場合はオプションでもあります(実際には、32以下ですが、正式な保証はわずか16ビットです)。
最後に、すべての大文字の識別子は、名前の衝突の確率を減らすために、マクロ専用の慣習(Microsoftを除く)によって行われます。したがって、マクロ以外のものにすべての大文字識別子を使用しないことをお勧めします。また、常にマクロのすべての大文字識別子を使用することもできます(これにより、それらを認識しやすくなります)。
乾杯&hth。、
ビットセットにはあります より多くの操作
アプローチ番号1は、4バイトの整数の配列としてコンパイルされる可能性が高く、それぞれの1ビットを使用してデータを保存します。理論的には、スマートコンパイラがこれを最適化することができますが、私はそれを期待しません。
あなたが使いたくない理由はありますか? std::bitset
?
引用する cplusplus.comのBitsetのページ, 「クラスは通常の配列に非常に似ていますが、スペース割り当てに最適化されています」。 INTが4バイトの場合、ビットセットは32倍のスペースを使用します。
やっています bool bits[100]
, 、SBIが示唆したように、ほとんどの実装には> = 1バイトブールがあるため、Bitsetよりもさらに悪いです。
知的好奇心のみの理由でのみ、独自のビットセットを実装したい場合、ビットマスクを使用してそうすることができます。
typedef struct {
unsigned char bytes[100];
} MyBitset;
bool getBit(MyBitset *bitset, int index)
{
int whichByte = index / 8;
return bitset->bytes[whichByte] && (1 << (index = % 8));
}
bool setBit(MyBitset *bitset, int index, bool newVal)
{
int whichByte = index / 8;
if (newVal)
{
bitset->bytes[whichByte] |= (1 << (index = % 8));
}
else
{
bitset->bytes[whichByte] &= ~(1 << (index = % 8));
}
}
(ちなみにクラスの代わりに構造体を使用して申し訳ありません。学校の低レベルの割り当ての真っin中にいるので、ストレートCで考えています。クラスを使用することの2つの大きな利点は、オペレーターの過負荷と可変サイズの配列を持つ機能。)