Урок 8.2. Битовые поля

8.2. Битовые поля

Многие задачи требуют создания минимальных по размеру программ. Один из
способов экономии памяти в программах на Си заключается в использовании битовых
полей для представления совокупности данных целого типа. Битовое поле может
иметь тип либо signed int либо unsigned int и занимать от 1 до 16 битов.

Битовые поля могут описываться только в качестве элементов структурного
шаблона аналогично объявлению целой знаковой или беззнаковой переменной, после
имени которой через двоеточие записывается целая константа, определяющая размер
битового поля. В описании допускаются неименованные битовые поля (для них имя
опускается, а указывается только двоеточие и размер), которые используются как
заполнители пространства битового поля. Битовые поля размещаются в направлении
от младших к старшим битам в слове. Например,
описание:

struct BITFLDS

{ int a:3;

unsigned b:4;

int c:1;

int :3;

unsigned d:2;

} flags;

обеспечивает размещение в памяти структурной переменной flags,
включающей в себя битовые поля с именами a, b, c и d, как показано на рис. 9.3.

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Не используется

d

Не используется

c

b

a

Рис. 9.3. Размещение в памяти битовых полей.

Поля не могут переходить через границы памяти целого числа. Например,
если бы поле d имело размер более 5-ти битов, то оно было бы размещено в
следующем слове. Для принудительного выравнивания к границе следующего слова
используется размер 0. Если в рассматриваемой структуре BITFLDS описать поле
без имени int :3; как int :0; , то поле d будет размещено в новом слове.
Битовые поля обрабатываются как целые укороченного размера. Их можно
использовать в любых выражениях и с любыми операциями за исключением операции
взятия адреса. Обращение к полям осуществляется аналогично обращению к другим
элементам структуры, то есть с использованием операции точка, например так:

flags.a=1;

if(flags.b == flags.d)...

Наиболее частым применением битовых полей является использование их в
качестве набора переключателей, характеризующих состояние некоторого объекта
программы. Например, структурнаяпеременная key:

struct { unsigned shift:1;

unsigned ins:1;

unsigned cups:1;

} key;

позволяет хранить
информацию о состоянии клавиатуры компьютера. При этом включение и выключение
признаков осуществляется понятной операцией присваивания (в другом случае
пришлось бы пользоваться логическими операциями):

key.ins=1;

key.cups=0;

а проверка состояния
переключателей - условным оператором:

if(key.shift==1 && key.cups==1)...

Заметим, что битовое поле внутри структурного шаблона не может быть
массивом, хотя описание массива структур, каждый элемент которого может
содержать битовые поля, вполне обосновано и не противоречит синтаксису Турбо
Си. Используя ранее приведенный структурный шаблон BITFLDS, можно сделать
описание:

struct BITFLDS system[10];

Структурные переменные не обязательно должны включать в себя только
битовые поля, как это имело место в приводимых примерах, а, наряду с битовыми
полями, в них могут содержаться элементы и других типов:

struct COORDINATES {

int x: 5;

int y: 5;

int z: 5;

};

struct DETAL {

float a; /* Длина */

float b; /* Ширина */

float c; /* Высота */

char name[20]; /* Шифризделия */

struct COORDINATES point;

};

struct DETAL rez, /* Резисторы */

cond; /* Конденсаторы */

и доступ к битовому
полю осуществляется также, как и в случае вложенных структурных переменных,
например, rez.point.x

рассказать друзьям и получить подарок

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов