Битовые поля Другим
интересным способом использования битов является создание битовых полей.
Имея битовые поля, вы можете установить миниатюрную структуру в
пределах байта (BYTE), слова (WORD) или двойного слова (DWORD). К
примеру, мы хотим следить за датами, но нам нужно использовать как можно
меньше памяти. Мы можем определить следующую структуру struct date_struct { BYTE day : 5, // 1 до 31 month : 4, // 1 до 12 year : 14; // 0 до 9999 } date;
В
данном примере поле, хранящее день, занимает нижние 5 бит, месяц
занимает следующие четыре бита, а год - остальные 14 бит. Поэтому мы
можем сохранить структуру даты в 23-х битах, что содержится в 3-х
байтах. Двадцать четвертый бит игнорируется. Если бы мы определили дату в
виде целочисленных значений (integer) для каждого поля, то структура
заняла бы 12 байт. |0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0| | | | | +------ год ---------------+ месяц +-- день--+
Теперь давайте разберем данное определение на части и изучим то, что происходит.
Во-первых,
изучим тип данных, который мы используем для структуры битового поля. В
данном случае мы использовали байт(BYTE). Байт(BYTE) состоит из 8 бит
и, используя его, компилятор распределит один байт памяти. Тем не
менее, если мы будем использовать более 8 бит в нашей структуре, то
компилятор распределит еще один байт, то есть будет выделено столько
байт, сколько необходимо для нашей структуры. Если бы мы использовали
WORD или DWORD, то компилятор бы распределил в общем 32 бита для нашей
структуры.
Давайте изучим определение различных полей. У нас есть
переменные (день, месяц и год), а за ними следуют колонка, которая
разделяет переменную от числа бит, которые он содержит. Каждое битовое
поле отделяется запятой, и список завершается точкой с запятой.
Теперь есть декларация структуры. Мы располагаем битовые поля в такой
структуре, тем самым мы можем использовать стандартную нотацию доступа к
структуре для получения членов структуры. Также, поскольку мы не можем
получить адреса битовых полей, мы теперь может использовать адрес
структуры.
date.day = 12; dateptr = &date; dateptr->year = 1852;
|