485. Битовые поля
Во многих функциях, приведенных в этой книге, показано, как уменьшить количество переменных (а значит, и количество занимаемой памяти) в том случае, когда параметры функции или возвращаемое значение имеют битовую структуру. Если отдельные биты или их комбинации имеют определенный смысл, то можно использовать в программе битовые операции для получения значений группы битов. Предположим для примера, что программа работает с датами количеством 100 000. Один из способов - создать структуру типа Date:
struct Date {
int month; // от 1 до 12
int day; // от 1 до 31
int year; // последние две цифры
};
В качестве альтернативы для хранения даты можно использовать'битовое представление одного значения unsigned int, как показано на рис. 485.
Рис. 485. Битовое представление даты
Таким образом, каждый раз при присваивании даты в программе необходимо использовать корректные битовые операции, как показано в следующем фрагменте:
unsigned date;
date = month;
date = date | (day << 4);
date = date | (year << 9);
printf("Месяц %d День %d Год %d", date & OxF,
(date >> 4) & OxIF, (date >> 9));
Однако, чтобы программа была проще для понимания, Си дает возможность создавать структуру, составленную из битовых полей. При объявлении такой структуры в каждом поле после двоеточия указывается количество битов на этом поле:
struct Date {
unsigned month:4;
unsigned day:5;
unsigned year:7;
} date;
Обращение к битовым полям делается следующим образом:
date.month = 12;
date.day = 31;
date.year = 94;
printf("Месяц %d День %d Год %d", date.month, date.day, date.year);
Примечание: При объявлении битовых полей тип элементов структуры должен быть целым без знака (unsigned int).
486. Представление битовых полей в структуре
В С485 обсуждалась возможность поразрядного представления значения с использованием структуры битовых полей. При объявлении такой структуры Си выделяет достаточно памяти для хранения всех битов структуры. Если в последнем байте некоторые биты не использованы, те большинство Си-компиляторов инициализируют эти биты нулями. Для пояснения того, как Си хрант информацию в структуре битовых полей, приводится рис. 486, иллюстрирующий представление битовых полей структуры Date.
struct Date {
unsigned month:4;
unsigned day:5;
unsigned year:7;
} date;
Рис. 486. Представление битовых полей структуры Date