在位域集合中设置检测至少一位

时间:2016-11-09 21:30:47

标签: c embedded bit-fields bitflags

在我的程序中,我有一个C位域结构:

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

现在我要检查至少有一个标志是在上面的结构中设置的,如果有的话,做一些操作否则返回。

虽然我可以通过逐位检查来做到这一点,但对于我的嵌入式应用程序来说这将是处理器密集型的,因为标志的结构足够大。我正在寻找一些操作,如(operation & 0xFF)来检测。

所以有人可以建议如何在C ??

中这样做

1 个答案:

答案 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的字段。它可以工作,但看起来仍然很奇怪。