我有一些逻辑,我想存储为整数。我有30个“位置”,可以是是或否,我想将其表示为整数。当我循环遍历这些位置时,将这些信息存储为整数的最简单方法是什么?
答案 0 :(得分:3)
struct{
int flag0:1;
int flag1:1;
...
int flag31:1;
} myFlags;
在整数:x
成员的定义中使用struct
表示分配了x位的位域。
您可以像往常一样访问每个结构成员,但值只能根据位的大小(在我的示例中 - 1或0,因为只有1位可用),编译器将强制执行它。结构将(可能取决于编译器设置)打包到表示总位数所需的整数总大小。
另一种选择是使用int
和按位运算符&
和|
来访问特定位。在这种情况下,你必须确保自己设置一个位不会影响另一个,并且没有溢出等。
答案 1 :(得分:3)
您可以使用32位uint:
uint32_t flags = 0;
flags |= UINT32_C(1) << x; // set x'th bit from right
flags &= ~(UINT32_C(1) << x); // unset x'th bit from right
if (flags & UINT32_C(1) << x) // test x'th bit from right
答案 2 :(得分:1)
#define POSITION_A 1
#define POSITION_B 2
unsigned int position = 0;
// set a position
position |= POSITION_A;
// clear a position
position &= = ~(POSITION_A);
答案 3 :(得分:0)
是的,作为WTP的评论,您可以将所有数据保存在一个unsigned int(uint32_t)中,并使用AND(&amp;),OR(|),NOT(〜)访问它。
但是,如果保存存储不是主要问题,我建议不要使用这种紧凑的技术。
如果我是你,我将使用一些小型int(short或char)的数组/列表来存储值。这有点浪费存储,但更容易阅读,更容易添加更多功能。