Можно ли использовать массив битовых полей?

Мне любопытно узнать, Можно ли использовать массив битовых полей? Нравится:

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

Ответы

Ответ 1

Нет, вы не можете. Бит-поле может использоваться только с интегральными переменными типа.

C11-§6.7.2.1/5

Поле бит должно иметь тип, который является квалифицированной или неквалифицированной версией _Bool, signed int, unsigned int или другого типа, определенного для реализации.

В качестве альтернативы вы можете сделать это

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

но его размер будет в 5 раз больше размера struct (как указано в comment @Jonathan Leffler) с 5 членами с полем бит 4. Таким образом, здесь это не имеет особого смысла.

Более внимательно вы можете это сделать

struct st
{
    uint8_t i: 4;   // Will take only a byte
} arr_st[5]; 

Ответ 2

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