На этом шаге мы рассмотрим особенности использования битовых полей в структурах.
Структуры обладают замечательным свойством: с их помощью можно задавать битовые поля: определять в переменной типа int группы подряд расположенных битов, значения которых можно задавать и с которыми можно работать как с элементами структуры. Описание битовых полей чере структуру задается следующим образом:
struct { unsigned name1: size1; //имя поля и его размер unsigned name2: size2; //имя поля и его размер . . . unsigned nameK: sizeK; //имя поля и его размер } flags;
Это обычное задание шаблона и на нем экземпляра структуры.
Размер - это количество битов, расположенных подряд. Сумма всех полей не должна выходить за пределы размера переменной типа int. Если же это случится, то первое битовое поле, превысившее размер переменной int, pасположится в следующем участке памяти, отведенном для переменной типа int.
struct { unsigned n1: 1; //имя поля и его размер unsigned n2: 2; //имя поля и его размер } flags;
Здесь определен экземпляр структуры - переменная flags, содержащая два битовых поля: одно однобитовое, другое - двубитовое. На поля можно ссылаться как на отдельные члены структуры: flags.n1, flags.n2. Эти поля ведут себя подобно целым без знака и могут участвовать в арифметических операциях, применяемых к целым без знака. Например, для определенных выше полей можно записать:
flags.n1 = 1; //включен бит flags.n1 = 0; //выключен бит flags.n2 = 3; //включены биты 1,2 поля (3 в десятичной системе равно 11 в двоичной).
Для проверки значения битов можно писать:
if (flags.n2 == 1 && flags.n1 == 0) ...
На следующем шаге мы рассмотрим категории памяти.