|
Программирование >> Структурное программирование
Рис. 16.12. Операции поразрядного присваивания Результат сдвига влево 960 = 00000011 11000000 на 8 битов с использованием операции сдвига влево : 49152 = 11000000 00000000 Результат сдвига вправо 960 = 00000011 11000000 на 8 битов с использованием операции сдвига вправо : 3 = 00000000 00000011 Рис. 16.11. Использование операций поразрядного сдвига (часть 2 из 2) Операция сдвига влево { ) сдвигает биты своего левого операнда влево на количество битов, заданное правым операндом. Биты, расположенные справа, освобождаются и заполняются нулями; левые разряды, сдвинутые за пределы операнда, теряются. В программе, приведенной на рис. 16.11, переменной numberl присваивается значение 960 (00000011 11000000). Результатом операции сдвига влево значения переменной numberl на 8 битов с помощью выражения numberl 8 является значение 49152 (11000000 00000000). Операция сдвига вправо ( ) сдвигает биты своего левого операнда вправо на заданное правым операндом количество битов. Выполнение операции сдвига вправо целого значения типа unsigned приводит к освобождению левых битов, которые заполняются нулями. В программе, приведенной на рис. 16.11, результатом операции сдвига вправо значения переменной numberl на 8 битов с помощью выражения numberl 8 является значение 3 (00000000 00000011). Типичная ошибка программирования 16.8 Результат сдвига какого-либо значения не определен, если правый операнд является отрицательным или если правый операнд больше числа битов в левом операнде. Замечание по мобильности 16.4 Результат сдвига вправо целого значения со знаком (типа signed) является машинно-зависимым. Некоторые компьютеры заполняют освобожденные биты нулями, а другие компьютеры используют бит знака. Каждая поразрядная операция (за исключением операции поразрядного НЕ) имеет соответствующие операции присваивания. Эти операции поразрядного присваивания показаны на рис. 16.12 и выполняются аналогично арифметическим операциям присваивания, которые рассмотрены в главе 2. На рис. 16.13 показаны приоритет и ассоциативность различных операций языка С4-4-, рассмотренных нами к настоящему моменту. Эти операции приведены в порядке убывания их приоритета.
Рис. 16.13. Приоритет и ассоциативность операций 16.8. Битовые поля Язык С++ предоставляет возможность задавать количество битов, в которых хранятся элементы типов unsigned или int класса или структуры (или элементы объединения - см. главу 18, Другие темы ). Такие элементы называются битовыми полями. Битовые поля позволяют рационально использовать память с помощью хранения данных в минимально требуемом количестве битов. Элементы битовые поля должны быть объявлены как тип int или unsigned. Совет по повышению эффективности 16.2 Битовые поля способствуют рациональному использованию памяти. struct BitCard { unsigned face : 4 ; unsigned suit: 2; unsigned color : 1; void fillDeck(BitCard *); void deal(BitCard *); main () { BitCard deck [52] ; Рис. 16.14. Использование битовых полей для хранения колоды карт (часть 1 из 2) Рассмотрим следующее описание структуры: struct BitCard { unsigned face : 4 ; unsigned suit : 2; unsigned color : 1; Это описание включает три битовых, поля типа unsigned: face, suit и color, используемых для представления карт колоды, состоящей из 52 карт. При объявлении битового поля вслед за указанием типа элемента unsigned или int ставится двоеточие (:) и пишется целочисленная константа, задающая ширину поля (т.е. число битов, в которых хранится этот элемент). Ширина поля должна быть целочисленной константой в диапазоне между О и заданным общим числом битов, используемых для хранения целого значения типа int в вашей системе. Приведенные ниже примеры были проверены на компьютере с двухбайтовым (16 битов) представлением целого значения. Приведенное выше описание структуры показывает, что для хранения элемента face выделено 4 бита, для хранения элемента suit - 2 бита и для хранения элемента color - 1 бит. Количество битов определяется ожидаемым диапазоном значений для каждого элемента структуры. Элемент face хранит значения от О (Туз) до 12 (Король) в области памяти размером 4 бита (4 бита, выделенные для элемента face, могут хранить значения от О до 15). Элемент suit может хранить значения от О до 3 (О = бубны, 1 = черви, 2 = трефы и 3 пики). Область памяти размером 2 бита, выделенная для элемента suit, может хранить значения от О до 3. И, наконец, элемент color хранит либо О (Красный), либо 1 (Черный). Область памяти размером 1 бит, выделенная для элемента color, может хранить либо О, либо 1. Программа, приведенная на рис. 16.14 (выходные данные показаны на рис. 16.15), создает массив deck, содержащий 52 структуры struct типа bit-Card. Функция fillDeck вставляет 52 карты в массив deck, а функция deal выводит на печать 52 карты. Заметим, что элементы битового поля структур доступны точно так же, как и другие элементы структуры. Элемент color включается как средство отображения цвета карты в системе, которая, позволяет отображать цвет. Пример использования битовых полей для хранения колоды карт iclude <iostream.h> iclude <iomanip.h>
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |