This question already has answers here:
Closed 2 years ago.
Test for all bit fileds in C at once
(2个答案)
在我的程序中,C位字段结构如下:
现在我想检查至少有一个标志是在上面的结构中设置的,如果是这样,请执行一些操作,否则返回。
虽然我可以通过逐点检查来完成,但对于我的嵌入式应用程序来说,这将是处理器密集型的,因为标志的结构足够大。我正在寻找一些操作,如(
那么有人能在C语言中建议怎么做吗??
当然,如果
更喜欢对位字段使用无符号类型,除非您有充分的理由使用有符号类型。在您的情况下,对于带符号的
(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