Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
42
Добавлен:
16.02.2016
Размер:
558.59 Кб
Скачать

Int main ()

{

cout « "Size of int type: ";

cout « sizeof (int) « '\n';

cout « "Size of float type: ";

cout « sizeof(float) « '\n';

cout « "Size of double type: ";

cout « sizeof(double) « '\n';

cout « "Size of char type: ";

cout « sizeof(char) « '\n';

return 0;

}

Поразрядные логические операции

В практике программирования приходится отслеживать состояния различных программных объектов с помощью вспомогательных переменных, которые стали называть флагами. Для этой цели можно использовать булевские переменные. Однако, если у вас слишком много признаков, удобнее в качестве флагов использовать отдельные биты переменных. Для ПК на платформе Intel один байт представляет собой восемь бит информации, а каждый бит может принимать значение 0 или 1. Таким образом, в одном байте может быть закодировано любое целое число от 0 до 255 включительно (28 = 256). Биты в байте считаются справа налево.

Рассмотрим, например, панель из пяти переключателей SW1 ... SW5 Можно было бы объявить в качестве флагов 5 переменных типа bool (по 1 байту на каждый объект). Каждый выключатель может принимать состояние "включено" (1 - true) или "выключено" (0 - false).

bool SW1, SW2, SW3, SW4, SW5;

Тогда, проверяя значения указанных выше переменных, можно судить о состоянии того или иного переключателя.

Принимая во внимание тот факт, что биты в байте также могут принимать значения только нуля или единицы, используя компактную запись, эту же панель можно было бы уместить всего в одном байте.

Рис. 3.1. Вариант установки значений битовых переменных в байте.

Для того, чтобы программист мог свободно адресоваться к отдельным битам, предложены специальные поразрядные логические операции, приведенные в табл. 3.1.

Таблица 3.1.

Поразрядные логические операции

&

логическое И (умножение)

I

логическое ИЛИ (сложение)

^

исключающее ИЛИ

~

логическое НЕ (инверсия)

Результат применения оператора "логическое И" (умножение) к двум битам равен единице только тогда, когда оба операнда установлены в единицу (см. табл. 2.2).

Таблица 3.2.

Операция "логическое И"

А

В

С = А&В

0

0

0

0

1

0

1

0

0

1

1

1

При логическом ИЛИ (сложении) результат равен единице, если хотя бы один из участвующих в операции бит установлен в единицу (см. табл. 3.3).

Таблица 3.3.

Операция "логическое ИЛИ"

А

B

С = АIВ

0

0

0

0

1

1

1

0

1

1

1

1

В таблице 3.4 показано, что исключающее ИЛИ (иногда для упрощения понимания называют "исключительно ИЛИ") возвращает единицу только в том случае, если операнды не равны (первый операнд - единица, а второй-ноль или наоборот).

Таблица 3.4.

Операция "исключающее ИЛИ"

А

B

С = А^В

0

0

0

0

1

1

1

0

1

1

1

0

Операция "логическое НЕ" (см. табл. 3.5) инвертирует биты (меняет исходное логическое значение на противоположное). Если исходный бит установлен, после применения к нему данной операции он сбрасывается. И наоборот, если бит сброшен в ноль, логическое НЕ установит его в единицу.

Таблица 3.5.

Операция "логическое НЕ"

А

С = ~А

0

1

1

0

Вернемся к примеру с панелью переключателей и отведем для всей панели однобайтную переменную, например, типа char:

char SW = 0;

Присвоив первоначально переменной SW значение 0 (или в двоичном виде 00000000), мы тем самым указываем, что все переключатели находятся в выключенном состоянии.

Теперь предположим, что необходимо включить третий переключатель на панели (SW3 на рис. 3.1), т.е. надо сделать так, чтобы переменная SW в двоичном виде выглядела как 00000100(или в шестнадцатеричном виде 0x04). Для этого применим для этого операцию "логическое ИЛИ":

SW = SW | 0x04; // включить SW3

Аналогичным образом включим первый выключатель:

SW = SW | 0x01; // включить SW1

Предположим, что по ходу программы значение байта SW изменялось каким-то образом и перед нами стала задача выключить третий и первый переключатели, не имея информации об их текущем состоянии. Для сброса(перевода в 0) отдельных бит в байте на практике применяют операцию "логическое И".

SW = SW & 0xFA; // FA16 = 111110102

И в заключение изменим состояние четвертого выключателя на противоположное, независимо от его исходного значения, применив операцию "исключающее ИЛИ":

SW = SW ^ 0x08; // 0816 = 000010002

В практике программирования часто используется сокращенная форма записи присвоения результата поразрядных логических операторов:

& = //побитовое И с присваиванием

| =// побитовое логическое ИЛИ с присваиванием

^ = //побитовое исключающее ИЛИ с присваиванием

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

Для осуществления сдвига последовательности бит влево и вправо применяются соответственно операции « и ». Операнд справа от знака операции указывает, на какую величину должны быть сдвинуты биты, задавая тем самым количество бит, "выводимых" из переменной, и число нулевых бит, заполняющих переменную с другой стороны.

Рис. 3.2. Пример установки значений битов в байте.

Например:

unsigned char A = 12; // А = 000011002

А = А « 2; // А = 001100002

А = А » 3; // А = 000001102

Следует учитывать, что при использовании правого сдвига, если самый старший бит равен единице (признак отрицательного числа у переменных со спецификатором signed), некоторые компиляторы могут не "ввести" нули слева. Это связано с тем, что, чтобы избежать подобных ситуаций, рекомендуется преобразовывать операнд операции в беззнаковый тип (unsigned).

Соседние файлы в папке ЛекцииКарасева