2010-11-28 2 views
4

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

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

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

+0

Является ли это для ввода/вывода с памятью? – nmichaels 2010-11-28 22:04:36

+0

Что такое бит-упакованная структура? – 2010-11-28 22:08:29

+0

Нет. Это для некоторых метаданных во время выполнения, которые будут храниться и получать доступ из стека. – mhahnenb 2010-11-28 22:10:36

ответ

6

Если вы просто положить его в (32-бит) Int, то вы можете аккуратно перебирать биты с цикл, как это:

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

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

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

1

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