4

4 から 10 の間の多くのブール値フィールドを必要とする一連のクラスがあります。各ブール値にバイトを使用する必要はありません。私は次のようなビットフィールド構造体を調べてきました:

struct BooleanBitFields
    {
        bool b1:1;
        bool b2:1;
        bool b3:1;
        bool b4:1;
        bool b5:1;
        bool b6:1;
    };

しかし、いくつかの調査を行った後、これにより非効率的なメモリアクセスが発生する可能性があり、メモリを節約する価値がないと多くの人が言っているのを目にします。この状況に最適な方法は何だろうと思っています。8 ビットを格納するには、ビット フィールドを使用する必要がありますか、それともビット マスキング (and および or s) を含む char を使用する必要がありますか? 2番目の解決策は、ビットシフトまたはロジックを使用する方が良いですか?

誰かがどの方法を使用するか、そしてなぜそれがどのルートを下るべきかを決定するのに本当に役立つかについてコメントできれば.

前もって感謝します!

4

3 に答える 3

1

ビット フィールドは、コンパイラの推奨事項にすぎません。コンパイラは、好きなように自由に実装できます。組み込みシステムでは、1 ビットからビットへのマッピングを保証するコンパイラがあります。他のコンパイラはそうではありません。

あなたのような通常の構造体を使用しますが、ビットフィールドは使用しません。それらを unsigned chars にします - 最短のデータ型です。IDE がオートコンプリートをサポートしている場合、構造体を使用すると、編集中にアクセスしやすくなります。

于 2012-04-21T19:10:03.757 に答える
1

int ビット配列を使用し (展開するスペースが多くあり、単一の文字には利点がありません)、マスク定数でテストします。

#define BOOL_A 1
#define BOOL_B 1 << 1
#define BOOL_C 1 << 2
#define BOOL_D 1 << 3

/* Alternately: use const ints for encapsulation */    

// declare and set
int bitray = 0 | BOOL_B | BOOL_D;

// test
if (bitray & BOOL_B) cout << "Set!\n";
于 2012-04-21T19:04:45.727 に答える
1

デスクトップ ボックスのアドレス空間が大きいため、32/64 ビットのブール値の配列は無駄に思えるかもしれません。実際、そうですが、ほとんどの開発者は気にしません (私も含めて)。RAM が制限されている組み込みコントローラーの場合、またはドライバーでハードウェアにアクセスする場合は、必ずビットフィールドを使用してください。

R/W の使いやすさ/速度とは別のもう 1 つの問題は、32 ビットまたは 64 ビットのブール値は、複数の論理演算によって操作する必要がある中央の 1 ビットよりもスレッドセーフであるということです。

于 2012-04-21T19:06:31.233 に答える