我有一个char *字符串进来,我需要相应地存储它。C中的枚举和字符串
的字符串可以是任何值{英国,GD,BD,ER,WR,FL}
的。如果我想将它们保持为枚举类型,其数据类型是最好的使用。就像6个值一样,三位就足够了,但是如何在C中存储三位?
我有一个char *字符串进来,我需要相应地存储它。C中的枚举和字符串
的字符串可以是任何值{英国,GD,BD,ER,WR,FL}
的。如果我想将它们保持为枚举类型,其数据类型是最好的使用。就像6个值一样,三位就足够了,但是如何在C中存储三位?
你想要的是一个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个不同的值)。
正如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
。
'value:2'不起作用?另外,有6个值,两位是不够的。你需要3. –
“两个位就够了”......你会对其他六个位做一些根本性的重要事情吗,或者是无缘无故让生活更加艰难? – Jon
你究竟建议如何在六位选项中存储两位选择? – Kevin