我有一个 char* 字符串进来。我需要相应地存储它。
字符串可以是任何这些值 { UK, GD, BD, ER, WR, FL}
如果我想将它们保留为枚举类型,那么最好使用哪种数据类型。对于 6 个值,三位就足够了,但是如何在 C 中存储三位呢?
你想要的是一个位字段:
typedef struct {
unsigned char val : 2; //use 2 bits
unsigned char : 6; // remaining 6 bits
} valContainer;
...
valContainer x;
x.val = GD;
请注意,实际上没有办法存储少于一个字节,因为字节的定义是计算机可以寻址的最小内存量。这只是一种将名称与字节中的不同位相关联的方法。
此外,当然,2 位对于 6 个值是不够的(2 位保存 4 个不同的值)。所以你真的需要至少 3 位(8 个不同的值)。
Just store them as an unsigned short. Unless you're storing other things in your struct to fill out a whole word, you're WAY prematurely optimizing. The compiler will have to pad out your data anyway.
正如 Eric Finn 的回答所暗示的,您可以使用位字段来存储 3 位的数据元素。但是,只有在同一个字节中有其他内容要存储时,这才有用。
struct {
unsigned char value: 3;
unsigned char another: 4;
unsigned char yet_another: 5;
// 12 bits declared so far; 4 more "padding" bits are unusable
} whatever;
如果要存储许多这样的小元素的数组,则必须以不同的方式进行,例如,在每个 32 位字中聚集 10 个元素。
int n = ...; // number of elements to store
uint32_t *data = calloc(n / 10, sizeof(*data));
for (int i = 0; i < n; i++)
{
int value = read_string_and_convert_to_int();
data[i / 10] &= ~(7 << (i % 10 * 3));
data[i / 10] |= value << (i % 10 * 3);
}
如果您只想拥有一个(或几个)元素,只需使用enum
or int
。