4

構造体に8つのブール値を格納する必要があるとしましょうが、それらに1バイトだけを一緒に使用したい場合は、次のようなことができます:

struct myStruct {
    bool b1:1;
    bool b2:1;
    bool b3:1;
    bool b4:1;
    bool b5:1;
    bool b6:1;
    bool b7:1;
    bool b8:1;
};

これで私は次のようなことができます

myStruct asdf;
asdf.b3=true;
asdf.b4=false;
if(asdf.b1)
    ...

これは今のところ正しいですか?(実際にはわかりません。以前はビットフィールドを使用したことがありません)

わかりました-しかし、8ビットのみを使用するように8つのブール値の静的配列を作成することも可能ですが、それでもインデックスでそれらをアドレス指定できますか?

何かのようなもの

struct myStruct {
public:
    bool b[8]:8;
};

多分?(これで、エラーC2033が発生します)

助けてくれてありがとう!

4

4 に答える 4

10

std::bitset 単純に宣言できるその方法を使用することをお勧めします。

std::bitset<8> asdf;

[] で使用します。

asdf[0] = true;
asdf[3] = false;
于 2009-11-20T18:42:19.190 に答える
1

コンパイラにやりたいことをさせることができるかもしれませんが、残念ながらそれは必須ではありません。たとえば、上記を受け入れる優れたコンパイラでさえ、myStructオブジェクトに 32 ビット ワード全体を割り当てることになる場合があります。

オプションがあり、そのレベルで型を制御し、それらがどのように配置され、割り当てられるかを知りたい場合は、おそらく Ada の使用を検討する必要があります。たとえば、次のコードは Ada で問題なく動作します。

type Bit_Set is array (1..8) of Boolean;
for Bit_Set'size use 8;

High_Mask : constant Bit_Set := (1..7 => false, 8 => true);

...これで、1 バイトのビットマスクと、ビット単位で機能する "and"、"or"、"xor" などの演算子ができました。

于 2009-11-20T18:55:11.397 に答える
1

byte一度にすべてを保持するためにデータ型を使用したくないですか? 次に、論理的なANDs とORs を使用して、物を取得/挿入するだけで済みます。必要ありませんstruct

于 2009-11-20T18:39:42.120 に答える
0

vector<bool>さまざまな理由から、それは良い考えだとは思いませ。メモリを節約するためだけにこれを行おうとしているのであれば、私は気にしません。さまざまな bool にアクセスしてビット フィールドからそれらを抽出するオーバーヘッドは、メモリ制限によって極端に制約されていない限り、保存するわずかなメモリよりもはるかに高くなる可能性があります。

直接の質問に答えるには、ブール/ビットフィールドを実行したい場合は、最初のアプローチを使用する必要があります。

通常、ビットフィールド/ビット調整アプローチの正当で受け入れられている使用法は、ハードウェア レジスタを処理する必要があり、ハードウェア レジスタをモデル化するか、ハードウェア レジスタをメモリ ロケーションのように見せてビット フィールドを重ね合わせた後に実際にアクセスしようとする場合です。レジスタ上の構造。

于 2009-11-20T18:42:17.833 に答える