Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Битовые поля

Битовые поля - это своеобразная структура, которая позволяет работать с отдельными битами. Синтаксис объявления битовых полей следующий:

struct [имя_структуры] { тип [имя_битового_поля1]: длина; тип [имя_битового_поля2]: длина;..... тип [имя_битового_поляN]: длина; } [имя_объекта];

В языке С в качестве типа битовых полей обязательно нужно использовать int или unsigned. В С++ разрешено использовать кроме перечисленных выше любой тип, интерпретируемый как целый: char, bool, short, long и перечисления. Длина битового поля задается целочисленным значением, которое определяет, сколько битов необходимо выделить указанному полю. Приведем пример битовых полей:

struct { unsigned name1: 1; unsigned name2: 3; unsigned name3: 5; } obj; obj.name1 = 1; obj.name3 = 30;

В приведенном примере мы создали три битовых поля. Для хранения элемента name1 выделено 1 бит, для хранения элемента name2 - 3 бита, а для хранения name3 выделено 5 бит. После объявления битовых полей в нашем примере происходит присвоение значений битовым полям. При этом удостоверьтесь, что присваиваимые значения не превышают размер поля.

Размер одного битового поля не должен превышать размер типа данного поля. То есть, если битовое поле объявлено как unsigned или int, то размер такого поля не должен превышать 32 бита.

Приведем еще один пример битовых полей. Данный пример иллюстрирует использование битовых полей для хранения колоды карт.

#include <iostream.h>#include <iomanip.h> //объявление битовых полей, которые описывают картуstruct Cards { unsigned face: 4; unsigned suit: 2;}; void FillKolody(Cards *);//функция для заполнения колодыvoid ShowKolody(Cards *);//функция для вывода колоды на экран void main(){ //создание массива, в котором хранится колода из 52 карт Cards koloda[52]; //вызов функции для заполнения колоды FillKolody(koloda); //показ колоды на экран ShowKolody(koloda);} void FillKolody(Cards*koloda){ for(int i = 0; i < 52; i++){ //присваиваем карте значение от 0(Туз) до 12(Король) koloda[i].face = i%13; //присваиваем масть карте koloda[i].suit = i/13; }} void ShowKolody(Cards*koloda){ int j = 0; //создаем массив значений карт char* arFace[] = {"Ace","2","3","4","5","6","7","8","9","10", "Jack","Queen","King"}; //создаем массив значений мастей char* arSuit[] = {"hearts","spades","diamonds","clubs"}; //выводим карты на экран в два столбца //в первом столбце карты от 0 до 25 //во втором - от 26 до 51 for(int i = 0; i < 26; i++){ j = i + 26; cout<<"Card:"<<setw(6)<<arFace[koloda[i].face] <<" Suit:"<<setw(9)<<arSuit[koloda[i].suit]; cout<<" Card:"<<setw(6)<<arFace[koloda[j].face] <<" Suit:"<<setw(9)<<arSuit[koloda[j].suit]; cout<<endl; }} выведет на экран Card: Ace Suit: hearts Card: Ace Suit: diamondsCard: 2 Suit: hearts Card: 2 Suit: diamondsCard: 3 Suit: hearts Card: 3 Suit: diamondsCard: 4 Suit: hearts Card: 4 Suit: diamondsCard: 5 Suit: hearts Card: 5 Suit: diamondsCard: 6 Suit: hearts Card: 6 Suit: diamondsCard: 7 Suit: hearts Card: 7 Suit: diamondsCard: 8 Suit: hearts Card: 8 Suit: diamondsCard: 9 Suit: hearts Card: 9 Suit: diamondsCard: 10 Suit: hearts Card: 10 Suit: diamondsCard: Jack Suit: hearts Card: Jack Suit: diamondsCard: Queen Suit: hearts Card: Queen Suit: diamondsCard: King Suit: hearts Card: King Suit: diamondsCard: Ace Suit: spades Card: Ace Suit: clubsCard: 2 Suit: spades Card: 2 Suit: clubsCard: 3 Suit: spades Card: 3 Suit: clubsCard: 4 Suit: spades Card: 4 Suit: clubsCard: 5 Suit: spades Card: 5 Suit: clubsCard: 6 Suit: spades Card: 6 Suit: clubsCard: 7 Suit: spades Card: 7 Suit: clubsCard: 8 Suit: spades Card: 8 Suit: clubsCard: 9 Suit: spades Card: 9 Suit: clubsCard: 10 Suit: spades Card: 10 Suit: clubsCard: Jack Suit: spades Card: Jack Suit: clubsCard: Queen Suit: spades Card: Queen Suit: clubsCard: King Suit: spades Card: King Suit: clubs

Как Вы уже поняли, ссылка на битовое поле выполняется по имени_битового_поля. Если имя поля не указано, запрошенные биты все равно выделяются, но доступ к ним невозможен. Такое поле называется неименованным битовым полем.

struct Example1 { unsigned n1: 6; unsigned: 2; unsigned n2: 14; unsigned: 2; unsigned n3: 5;};

Неименованные битовые поля с шириной поля 0 задают выравнивание следующего поля по границе максимального типа элементов структуры. Например, структура битовых полей

struct Example2 { unsigned n1: 12; unsigned: 0; unsigned n2: 8;};

использует неименованное поле нулевой ширины, чтобы пропустить оставшиеся биты в том элементе памяти, в котором хранится n1, и выровнять n2 по границе следующего элемента памяти. Элементом памяти выступает в данном случае 4 байта, то есть размер unsigned int. В общей сложности данная структура будет занимать в памяти 8 байт.

К битовым полям не может быть применена операция получения адреса (&) и поэтому не существует указателей на поля.

Порядок размещения битовых полей в памяти в значительной степени зависит от компилятора и аппаратного обеспечения. Не нужно пытаться экономить память с помощью битовых полей, так как это чаще всего не удается. При использовании битовых полей обычно предполагается, что память для них будет выделена в виде последовательности битовых ячеек, следовательно, структура, состоящая из трех 2-битовых полей, заняла бы 6 бит, следующих один за одним. Но так ли это на самом деле - зависит, в конце концов, от компилятора. Кроме того, адресация битов в памяти является менее рациональной, чем адресация байтов, так как компилятор должен генерировать специальные коды.

Битовые поля можно использовать для создания всевозможных масок и флагов, а также при создании двоично-упакованных объектов.

<== предыдущая лекция | следующая лекция ==>
Практический пример использования битовых операций | Типичная ошибка
Поделиться с друзьями:


Дата добавления: 2014-01-14; Просмотров: 358; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.