Битовые поля языка C предоставляют довольно удобный метод определения поля произвольной ширины внутри структуры (не говоря уже о проблемах с переносимостью в течение минуты). Например, вот простая структура с парой полей и «флагом»:
#pragma pack(push,1)
struct my_chunk{
unsigned short fieldA: 16;
unsigned short fieldB: 15;
unsigned short fieldC: 1;
};
#pragma pop()
Добавление операторов #pragma упаковывает эту структуру в 32- битовое слово (обеспечение того, чтобы манипуляции с указателями my_chunk
были выровнены, например, вместе с экономией места).
Доступ к каждому полю синтаксически очень удобен:
struct my_chunk aChunk;
aChunk.fieldA = 3;
aChunk.fieldB = 2;
aChunk.fieldC = 1;
Альтернативный способ сделать это без Помощь языка довольно уродлива и в значительной степени сводится к ассемблеру. например одно из решений - иметь макросы битового сдвига для каждого поля, к которому вы хотите получить доступ:
#define FIELD_A 0xFF00
#define FIELD_B 0x00FE
#define FIELD_C 0x0001
#define get_field(p, f) ((*p)&f)
#define set_field(p, f, v) (*p) = (v<
.. или что-то в этом роде (для большей формальности взгляните на this )
Итак, вопрос в том, если я хочу "сделать" битовые поля на ходу, как лучше всего это сделать?