Знакомство с логическими (побитовыми) операторами - Битовые поля
ОГЛАВЛЕНИЕ
Страница 3 из 3
Битовые поля
Другим интересным способом использования битов является создание битовых полей. Имея битовые поля, вы можете установить миниатюрную структуру в пределах байта (BYTE), слова (WORD) или двойного слова (DWORD). К примеру, мы хотим следить за датами, но нам нужно использовать как можно меньше памяти. Мы можем определить следующую структуруstruct date_struct {В данном примере поле, хранящее день, занимает нижние 5 бит, месяц занимает следующие четыре бита, а год - остальные 14 бит. Поэтому мы можем сохранить структуру даты в 23-х битах, что содержится в 3-х байтах. Двадцать четвертый бит игнорируется. Если бы мы определили дату в виде целочисленных значений (integer) для каждого поля, то структура заняла бы 12 байт.
BYTE day : 5, // 1 до 31
month : 4, // 1 до 12
year : 14; // 0 до 9999
} date;
|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;