在C中用单位测试和设置单个位的经典问题可能是最常见的中级编程技能之一.您可以使用简单的位掩码进行设置和测试
unsigned int mask = 1<<11;
if (value & mask) {....} // Test for the bit
value |= mask; // set the bit
value &= ~mask; // clear the bit
Run Code Online (Sandbox Code Playgroud)
一篇有趣的博客文章认为,这容易出错,难以维护,而且做法不佳.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) …Run Code Online (Sandbox Code Playgroud) 可能重复:
将位字段转换为int
我正在开发一个应用程序,其中一部分处理包含许多1位标志的16位字.我使用类似于下面所示的结构处理数据:
struct mystruct
{
uint16_t Reserved1 :3;
uint16_t WordErr :1;
uint16_t SyncErr :1;
uint16_t WordCntErr :1;
uint16_t Reserved2 :10;
};
Run Code Online (Sandbox Code Playgroud)
即该结构包含一个16位变量,该变量作为一些较小的(在某些情况下,1位标志)块处理.
我的问题是,是否有一种简单的方法可以将整个16位字作为一个值处理,比如将其输出到控制台或文件,或将其添加到另一个数据结构?除了移动单个结构元素并将它们添加到临时uint16_t变量之外,我不知道这样做的任何方法.似乎可能有一种更简单的方法来提取整个单词,但我找不到有关编译器如何处理这样的结构的任何信息.
编辑:我想这可能是显而易见的,但我想简单地做的是能够单独访问1位标志,以及将结构用作uint16_t类型的单个变量(即无符号短,16位).