2013-10-04 149 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