是否可以使用位域数组?

时间:2017-01-29 06:56:21

标签: c++ c arrays struct bit-fields

我很想知道,是否可以使用位字段数组?喜欢:

struct st
{
  unsigned int i[5]: 4;
}; 

2 个答案:

答案 0 :(得分:20)

不,你不能。位字段只能与整数类型变量一起使用。

C11-§6.7.2.1/ 5

  

位字段的类型应为_Boolsigned intunsigned 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);
}