2

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

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

现在我想检查上述结构中至少设置了一个标志,如果是这样,请执行一些操作,否则返回。

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

那么任何人都可以建议如何在C中做到这一点?

4

1 回答 1

3

没有正式的合法方式可以一次性完成。

这实际上是一种情况,其中“手动”实现位域(即通过位运算符访问的一个多位值)远远优于单独的 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的位字段,您最终会得到值为0and的“标志”字段-1。它可以工作,但仍然看起来很奇怪。

于 2016-11-09T21:49:24.017 回答