Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top