This question already has answers here:
Closed 2 years ago.
Test for all bit fileds in C at once
(2个答案)
在我的程序中,C位字段结构如下:
 typedef struct
 {
    char a:1;
    char b:1;
    char c:1;
    char d:1;
 }_OpModes;
 _OpModes Operation;

现在我想检查至少有一个标志是在上面的结构中设置的,如果是这样,请执行一些操作,否则返回。
虽然我可以通过逐点检查来完成,但对于我的嵌入式应用程序来说,这将是处理器密集型的,因为标志的结构足够大。我正在寻找一些操作,如(operation & 0xFF)来检测。
那么有人能在C语言中建议怎么做吗??

最佳答案

没有一种正式的法律途径可以一蹴而就。
在这种情况下,位字段的“手动”实现(即通过位运算符访问的一个多位值)远优于单独的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的“标志”字段结束。它可以工作,但看起来还是很奇怪。

关于c - 在位域集合中设置检测至少一位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40516347/

10-12 16:09