我有一個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