Знакомство с логическими (побитовыми) операторами - Битовые поля

ОГЛАВЛЕНИЕ


Битовые поля

Другим интересным способом использования битов является создание битовых полей. Имея битовые поля, вы можете установить миниатюрную структуру в пределах байта (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;