在C中测试和设置单个整数的经典问题可能是最常见的中级编程技能之一。您可以设置和测试简单的位掩码,例如
unsigned int mask = 1<<11;
if (value & mask) {....} // Test for the bit
value |= mask; // set the bit
value &= ~mask; // clear the bit
一篇有趣的博客文章认为这是容易出错的,难以维护的并且是错误的做法。C语言本身提供了类型安全和可移植的位级别访问:
typedef unsigned int boolean_t;
#define FALSE 0
#define TRUE !FALSE
typedef union {
struct {
boolean_t user:1;
boolean_t zero:1;
boolean_t force:1;
int :28; /* unused */
boolean_t compat:1; /* bit 31 */
};
int raw;
} flags_t;
int
create_object(flags_t flags)
{
boolean_t is_compat = flags.compat;
if (is_compat)
flags.force = FALSE;
if (flags.force) {
[...]
}
[...]
}
但这让我畏缩了。
我和我的同事对此颇有意思的争论仍未解决。两种样式都可以使用,并且我认为经典的位掩码方法简单,安全且清晰。我的同事都认为这是普通且容易的,但是位域联合方法值得用额外的几行内容来使其变得更加便携和安全。
双方还有其他论点吗?特别是可能存在字节序方法可能遗漏但可能采用字节序的错误,但结构方法是否安全?
心有法竹
胡子哥哥
哈士奇WWW
相关分类