我只需要一位来表示我的数据 - 1或0.在C中这样做的最佳方法是什么? "正常"数据类型太大。
答案 0 :(得分:15)
你可以创建
typedef struct foo
{
unsigned x:1;
} foo;
您告诉编译器您只使用x
的一位。
但是由于结构打包安排(C标准是有意灵活的,以便编译器可以根据机器架构进行优化),很可能会发现这仍然占用了内存中与常规{{1}一样多的空间。并且unsigned
的数组不必按位连续。
答案 1 :(得分:5)
如果您真的想要,可以使用成员变量bit-fielded创建一个结构到1位。
请记住,成员变量的数据类型必须为unsigned
,因为您需要存储0
和1
。
答案 2 :(得分:5)
如果您不需要数百万这些标记或内存限制非常有限,最好的方法绝对是int
。
这是因为int
通常与您平台的自然字大小相对应,并且可以快速访问正确对齐的内容。无论如何,机器一次读取一个字,并且使用单个位需要屏蔽和移位,这需要花费时间。在具有千兆字节RAM的典型PC上,这将是愚蠢的。
如果内存消耗确实是一个问题,则存在位域结构。
答案 3 :(得分:3)
可移植方式是变量的定义,其中各个位用作标志。
#define FLAG_FOO 0
#define FLAG_BAR 1
// in case platform does not support uint8_t
typedef unsigned char uint8_t;
uint8_t flags;
void flag_foo_set()
{
flags |= (1 << FLAG_FOO);
}
void flag_foo_clr()
{
flags &= ~(1 << FLAG_FOO);
}
uint8_t flag_foo_get()
{
return flags & (1 << FLAG_FOO);
}
虽然与C位字段相比,这似乎是超级流行的。它几乎可以移植到每个ANSI C编译器。
答案 4 :(得分:0)
通常,C中最小的可寻址数据块是一个字节。您不能指向某个位,因此您无法声明1位大小的变量。但正如Sourav Ghosh已经指出的那样,你可以声明位域,直接访问一位。