2013-10-04 151 views
0

我有一个char *字符串进来,我需要相应地存储它。C中的枚举和字符串

的字符串可以是任何值{英国,GD,BD,ER,WR,FL}

的。如果我想将它们保持为枚举类型,其数据类型是最好的使用。就像6个值一样,三位就足够了,但是如何在C中存储三位?

+0

'value:2'不起作用?另外,有6个值,两位是不够的。你需要3. –

+2

“两个位就够了”......你会对其他六个位做一些根本性的重要事情吗,或者是无缘无故让生活更加艰难? – Jon

+1

你究竟建议如何在六位选项中存储两位选择? – Kevin

回答

1

只需将它们存储为未签名的short。除非你在结构中存储其他东西来填充整个单词,否则你会过早地进行优化。编译器将不得不填充你的数据。

+1

'unsigned short'似乎很奇怪;也许是'unsigned char'或者只是'int'? – anatolyg

+0

是的,这样的事情可以正常工作。我不确定为什么我选择了无符号短符号,我猜没有特别的原因。 – Falmarri

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

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); 
} 

如果你想只有一个元素(或几个),只需使用enumint