创建具有大量标志的位标志变量或如何创建大位宽数字

标签 c bitflags

假设我有一个枚举,其位标志选项大于标准数据类型中的位数:

enum flag_t {
FLAG_1 = 0x1,
FLAG_2 = 0x2,
...
FLAG_130 = 0x400000000000000000000000000000000,
};

由于多种原因,这是不可能的。枚举的最大大小为 128 位(在我的系统上的 C/gcc 中来自实验),单个变量的最大大小也为 128 位等。

在 C 中,您不能对数组执行按位运算,但在 C++ 中,我想您可以重载按位运算符来使用循环来完成这项工作。

在 C 语言中,除了手动记住哪些标志去哪里才能对大量数据起作用之外,还有其他方法吗?

最佳答案

这正是位域的用途。

在 C 中,可以定义以下数据布局:

struct flag_t 
{
     unsigned int flag1 : 1;
     unsigned int flag2 : 1;
     unsigned int flag3 : 1;
(...)
     unsigned int flag130 : 1;
(...)
     unsigned int flag1204 : 1;   // for fun
};

在这个例子中,所有标志只占用一位。一个明显的优势是无限数量的标志。另一个很大的优势是您不再局限于单位标志,您可以在中间合并一些多值标志。

但最重要的是,就单元操作而言,测试和归因会有所不同,并且可能会有所简化:您不再需要进行任何屏蔽,只需通过命名直接访问标志即可。顺便说一句,利用这个机会给这些标志更全面的名称:)

关于创建具有大量标志的位标志变量或如何创建大位宽数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16421485/

相关文章:

为 AIX 编译 ANTLR 3C

c++ - 格式化输出c++的问题

c - "char *accum(const char *source);"在C中是什么意思?

使用逆波兰表示法和堆栈的计算器

_Atomic 类型说明符和限定符之间的 C11 语法歧义

c - 在位域集合中检测到至少一位被设置

c++ - 如何在 unsigned int 上使用位标志以在其中存储额外的 bool 值

C - 将枚举用于位标志 - 警告 : enumerated type mixed with another type