0

我有一个 char* 字符串进来。我需要相应地存储它。

字符串可以是任何这些值 { UK, GD, BD, ER, WR, FL}

如果我想将它们保留为枚举类型,那么最好使用哪种数据类型。对于 6 个值,三位就足够了,但是如何在 C 中存储三位呢?

4

3 回答 3

4

你想要的是一个位字段

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 个不同的值)。

于 2013-10-04T18:22:39.130 回答
1

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.

于 2013-10-04T18:17:59.610 回答
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);
}

如果您只想拥有一个(或几个)元素,只需使用enumor int

于 2013-10-04T18:33:34.760 回答