2

私のプログラムでは、次のような C ビットフィールド構造を持っています。

 typedef struct
 {
    char a:1;
    char b:1;
    char c:1;
    char d:1;
 }_OpModes;
 _OpModes Operation; 

ここで、少なくとも 1 つのフラグが上記の構造に設定されていることを確認したいと思います。設定されている場合は、何らかの操作を行います。

ビットごとにチェックすることでこれを行うことができますが、フラグの構造が十分に大きいため、組み込みアプリケーションではプロセッサに負荷がかかります。operation & 0xFF検出する( ) などの操作を探しています。

誰でもCでこれを行う方法を提案できますか??

4

1 に答える 1

3

一発でそれを行う正式な合法的な方法はありません。

これは実際には、ビットフィールドの「手動」実装 (つまり、ビットごとの演算子を介してアクセスする 1 つのマルチビット値) が、個別の 1 ビット ビットフィールドの言語レベルの宣言よりもはるかに優れている状況です。

言語レベルのビット フィールドを使用する場合でも、密接に関連するフラグを、個別の 1 ビット フィールドではなく、1 つの大きなビット フィールドにまとめることをお勧めします。一緒に処理されます)。たとえば、あなたの場合

#define FLAG_A 0x1
#define FLAG_B 0x2
#define FLAG_C 0x4
#define FLAG_D 0x8

typedef struct
{
    unsigned char abcd : 4;
} _OpModes;

もちろん、それabcdが構造体の唯一のフィールドである場合、ビットフィールドを使用する必要はまったくありません。データをパックするためのビット フィールドが存在し、パックするものがなければ、ビット フィールドは必要ありません。

また、符号付きを使用する正当な理由がない限り、ビットフィールドには符号なしの型を使用することをお勧めします。あなたの場合、符号付きcharビットフィールドの場合、 と の値を持つ「フラグ」フィールドに0なり-1ます。動作させることはできますが、それでも奇妙に見えます。

于 2016-11-09T21:49:24.017 に答える