我有一个char *字符串。我需要相应地存储它。
字符串可以是任何值{UK,GD,BD,ER,WR,FL}
如果我想将它们保留为枚举类型,哪种数据类型最好使用。就像6个值一样,三位就足够了,但如何在C?中存储三位?
答案 0 :(得分:4)
你想要的是Bit Field:
typedef struct {
unsigned char val : 2; //use 2 bits
unsigned char : 6; // remaining 6 bits
} valContainer;
...
valContainer x;
x.val = GD;
请注意,实际上没有办法存储少于一个字节,因为字节的定义是计算机可以处理的最小内存量。这只是一种将名称与字节中的不同位相关联的方法。
当然,对于6个值(2位保持4个不同的值),2位是不够的。所以你真的想要至少3位(8个不同的值)。
答案 1 :(得分:1)
将它们存储为未签名的短片。除非您在结构中存储其他内容以填写整个单词,否则您将过早地进行优化。无论如何,编译器必须填写您的数据。
答案 2 :(得分:0)
正如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
或int
。