Программирование >>  Структурное программирование 

1 ... 285 286 287 [ 288 ] 289 290 291 ... 342


Операции поразрядного присваивания

&=

Операция присваивания поразрядного И

Операция присваивания поразрядного ИЛИ

Операция присваивания поразрядного исключающего ИЛИ

Операция присваивания сдвига влево

Операция присваивания сдвига вправо

Рис. 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-, рассмотренных нами к настоящему моменту. Эти операции приведены в порядке убывания их приоритета.

Операции

Ассоциативность

:: (унарная)

справа налево

разрешение области действия

:: (бинарная)

слева направо

0 [] . ->

слева направо

различный

+ - + - ! (тип) S * ~ sizeof

справа налево

унарные

/ %

слева направо

мультипликативные

слева направо

аддитивные

слева направо

сдвиг

< <= > >=

слева направо

отношение

== ! =

слева направо

проверка на равенство

&

слева направо

поразрядное И

слева направо

поразрядное НЕ

слева направо

поразрядное ИЛИ

слева направо

логическое И

слева направо

логическое ИЛИ

справа налево

условная

+= -= *= /= %= 1= S= = =

справа налево

присваивание

слева направо

запятая

(последование)

Рис. 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>



1 ... 285 286 287 [ 288 ] 289 290 291 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика