在我的程序中,我有一个C位域结构:
typedef struct
{
char a:1;
char b:1;
char c:1;
char d:1;
}_OpModes;
_OpModes Operation;
现在我要检查至少有一个标志是在上面的结构中设置的,如果有的话,做一些操作否则返回。
虽然我可以通过逐位检查来做到这一点,但对于我的嵌入式应用程序来说这将是处理器密集型的,因为标志的结构足够大。我正在寻找一些操作,如(operation & 0xFF
)来检测。
所以有人可以建议如何在C ??
中这样做答案 0 :(得分:2)
没有正式合法的方式一次性完成。
这实际上是一种情况,其中"手册"位域的实现(即通过按位运算符访问的一个多位值)远远优于单独的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
位字段,您最终会得到" flag"值为0
和-1
的字段。它可以工作,但看起来仍然很奇怪。