我很想知道,是否可以使用位字段数组?喜欢:
struct st
{
unsigned int i[5]: 4;
};
答案 0 :(得分:20)
位字段的类型应为
_Bool
,signed int
,unsigned int
或其他实现定义类型的限定或非限定版本。
或者你也可以这样做
struct st
{
unsigned int i: 4;
} arr_st[5];
但其大小将是struct
的大小的5倍(如comment中{@ 3}}所述),其中5个成员各有位字段4
。所以,这里没有多大意义。
你可以做得更紧密
struct st
{
uint8_t i: 4; // Will take only a byte
} arr_st[5];
答案 1 :(得分:7)
C不支持位域数组,所以简短的答案是否定的。
对于非常大的数组,以这种方式打包值(每字节2个)可能是值得的:
#define ARRAY_SIZE 1000000
unsigned char arr[(ARRAY_SIZE + 1) / 2];
int get_4bits(const unsigned char *arr, size_t index) {
return arr[index >> 1] >> ((index & 1) << 2);
}
int set_4bits(unsigned char *arr, size_t index, int value) {
arr[index >> 1] &= ~ 0x0F << ((index & 1) << 2);
arr[index >> 1] |= (value & 0x0F) << ((index & 1) << 2);
}