Массив внутри немного упакованной структуры - PullRequest
4 голосов
/ 29 ноября 2010

Я хотел бы иметь массив внутри битовой структуры. Я статически знаю размер массива (32), и я хотел бы, чтобы каждый элемент в массиве был один бит. Например, я хотел бы сказать что-то вроде:

struct example_s {
  // ...
  unsigned int flags[32] : 32;
} __attribute__((__packed__));

Я пробовал пару вещей, но gcc не сдвинулся с места. Было бы неплохо сделать это так, чтобы я мог написать чистый код, который перебирает элементы упакованного массива. Идеи?

Ответы [ 2 ]

7 голосов
/ 29 ноября 2010

Если вы просто поместите его в (32-битное) int, то вы можете чисто перебирать биты с помощью цикла for, например так:

for (bit = 0; bit < 32; bit++)
    flagValue = ((flags & (1<<bit)) != 0;

Не намного сложнее написать, чем синтаксис индексации массива.

Если вы хотите скрыть сдвиг битов, чтобы сделать код более читабельным, вы даже можете использовать функцию или макрос для доступа к битам - например, GetFlag(bit)

1 голос
/ 29 ноября 2010

Элементы элементов битового поля не имеют адресов, поэтому даже если бы вы могли объявить их массив, не было бы никакого способа использовать его (весь доступ к массиву в C - это арифметика указателей и разыменование).Легко закодировать свой собственный битовый массив, используя биты большего типа;Джейсон объяснил основы.Как правило, вы должны избегать использования битовых полей, если у вас нет веских причин.Обычно они доставляют больше хлопот, чем стоят.

...