Работая со структурами данных, нам иной раз нужно оперировать не целым полем, а лишь его частью. Например, если мы хотим работать с IP-пакетами, то нужно учесть и те поля IP-заголовка, которые занимают половину байта, или даже бит.
И тут на помощь нам приходят битовые поля структур. Как понятно из названия, нужны они для доступа к отдельным битам (или наборам бит). Реализованы они в Си на базе структур:
struct <имя> {
<тип> <имя>: <размер>;
...
}
Пример использования:
#include <stdio.h>
struct SomeData {
unsigned a: 1;
unsigned b: 2;
unsigned c: 4;
unsigned d: 1;
unsigned e: 32; // Добавить/убрать для просмотра разницы
};
int main() {
struct SomeData data = { 0, 3, 12, 1, 1234 };
printf("%lu\n", sizeof(data));
printf("%d\n", data.a);
printf("%d\n", data.b);
printf("%d\n", data.c);
printf("%d\n", data.d);
printf("%d\n", data.e);
return 0;
}
Выравнивание идёт по тем же правилам, что и при работе с обычными полями.