Массив внутри битовой структуры
-
29-09-2019 - |
Вопрос
Я хотел бы иметь массив внутри битовой упакованной структуры. Я статически знаю размер массива (32), и я бы хотел, чтобы каждый элемент в массиве был одним битом. Например, я хотел бы иметь возможность сказать что -то вроде:
struct example_s {
// ...
unsigned int flags[32] : 32;
} __attribute__((__packed__));
Я пробовал пару вещей, но GCC не сдвинутся с места. Было бы неплохо иметь возможность сделать это, чтобы я мог написать чистый код, который итерация по элементам в упакованном массиве. Идеи?
Решение
Если вы просто поместите его в (32-разрядную) int, то вы можете чистотелетировать по поводу битов с контуром для цикла:
for (bit = 0; bit < 32; bit++)
flagValue = ((flags & (1<<bit)) != 0;
Не намного сложнее писать, чем синтаксис индексации массива.
Если вы хотите скрыть бит-Twiddling, чтобы сделать код более читаемым, вы можете даже использовать функцию или макрос для доступа к битам - например, GetFlag(bit)
Другие советы
Элементы элементов Bitfield не имеют адресов, поэтому, даже если вы могли бы объявить из них массив, никто не будет использовать его (все Access Access в C - это указатель арифметики и раздевательства). Легко кодировать свой собственный битовый массив, используя биты большего типа, хотя; Джейсон объяснил основы. Как правило, вы должны избегать использования битов, если у вас не очень хорошая причина. Они обычно больше неприятностей, чем они стоят.