Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
A.doc
Скачиваний:
37
Добавлен:
09.04.2015
Размер:
5.6 Mб
Скачать

79 Глава 2

Вы можете проверить это, пользуясь таблицей истинности операции &, которая была приведена выше. После присваивания result будет иметь значение 0x40, что соответствует символу

Поскольку & дает 0, если любой из соответствующих битов операндов равен 0, вы можете применять его в тех случаях, когда в переменной определенные биты должны были установлены в 0, независимо от их исходного значения. Это достигается соз- данием так называемой "маски" и комбинацией ее с исходной переменной с помо- щью &. Вы создаете маску, специфицируя значение 1 в тех битах, в которых старое значение нужно сохранить, и 0 — в тех битах, значение которых нужно сбросить в 0. Результатом применения И к маске и другому целому будет бит 0 в тех позициях, где стоит 0 в маске, и неизменное значение бита исходной переменной там, где в маске стоит 1. Предположим, что имеется переменная letter типа char, где в целях демон- страции вы хотите сбросить в 0 старшие 4 бита. Это очень просто достигается уста- новкой значения маски OxOF и комбинацией ее со значением letter посредством &:

или, более коротко:

Если изначально значение letter равно 0x41, то в результате любого из этих двух операторов оно станет равным 0x01. Эта операция проиллюстрирована на рис. 2.9.

А

&

1'

I l

Рис. 2.9. Применение маски к значению переменной

Нулевые биты маски сбрасывают в ноль соответствующие биты letter, а биты маски, равные 1, оставляют соответствующие биты letter неизмененными.

Аналогично вы можете использовать маску 0xF0, чтобы сохранить 4 старших бита и сбросить в ноль 4 младших.

Таким образом, следующий оператор:

даст в результате изменение значения letter с 0x41 на 0x40.

Битовое ИЛИ

Битовое ИЛИ (|), иногда называемое включающим ИЛИ, комбинирует соответ- ствующие биты операндов так, что результат равен 1, если хотя бы один из битов операндов в данной позиции равен 1, и 0, если оба бита равны 0. Таблица истинности для битового ИЛИ показана в табл. 2.6.

Данные, переменные и вычисления 81

Вы можете проверить это на примере установки индивидуальных флагов, упакован- ных в переменную типа int. Предположим, что имеется переменная по имени style типа short, которая содержит 16 индивидуальных 1-битных флагов. Предположим далее, что вам нужно установить отдельные флаги в переменной style. Одним из способов сделать это является определение значений, которые можно скомбиниро- вать операцией ИЛИ для установки определенных битов в 1. Чтобы установить край- ний правый бит, вы можете определить переменную:

Чтобы установить второй справа бит, вы должны определить вторую переменную

hredraw:

Тогда для установки двух правых крайних битов переменной style в 1 можно вос- пользоваться следующим оператором:

Эффект от этого оператора проиллюстрирован на рис. 2.10.

Поскольку операция ИЛИ дает в результате 1, когда любой из двух битов операн- дов равен 1, то объединение с ее помощью двух переменных дает в результате уста- новку обоих бит.

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

Этот оператор установит два крайних правых бита переменной style в 1, остав- ляя нетронутыми все остальные.