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

Поразрядный оператор исключающего или

Оказывается, поразрядный оператор исключающего ИЛИ (^) обладает волшебными свойствами. Листинг 2.6 демонстрирует работу этого оператора. Как и раньше, скомпилируйте и запустите эту программу, По приглашению введите два числа, разделенных одним пробелом,

Листинг 2.6. TXOR.C (поразрядный оператор исключающего ИЛИ)

___________________________________________________________

1: #include <stdio.h>

2: #include "pbin.c"

3:

4: main()

5: {

6: unsigned v1, v2, v3;

8: printf(“Enter values to OR exclusively: (ex: 1234 15) ");

9: scanf("%u %u", &v1, &v2);

10: v3 = v1 ^ v2;

11: printf(" %5u %#06x ", v1, v1); pbin(v1);

12: printf(“XOR %5u %#6x , v2, v2); pbin(v2);

13: prlntf("====================================\n");

14: printf(" %5u %#06x ", v3, v3); pbin(v3);

15: return 0;

16 }

_______________________________________________________

В табл. 2.6 отображены результаты применения оператора поразрядного исключающего ИЛИ к каждой возможной комбинации двух однобитовых операндов. Если два операнда равны, результат будет равен нулю; если отличаются друг от друга - единице. Если посмотреть на исключающее ИЛИ под другим углом зрения, то можно сказать, что наличие единицы в одном операнде переключает соответствующий разряд другого операнда с 1 на 0 или с 0 на 1.

Таблица 2.6. Поразрядная операция исключающего ИЛИ

А

^

В

==

С

0

^

0

==

0

0

^

1

==

1

1

^

0

==

1

1

^

1

==

0

С помощью простого эксперимента можно продемонстрировать важное свойство оператора поразрядного исключающего ИЛИ. Запустите программу TXOR и введите числа 45000 и -1 (разделенные одним пробелом). Программа отобразит следующее:

45000 0xafc8 1010111111001000

XOR 65535 0xffff 1111111111111111

=================================

20535 0х5037 0101000000110111

Число -1 в шестнадцатеричном представлении будет выглядеть как 0xffff, т.е. как 16-битовое беззнаковое значение, у которого все разряды равны 1. Если при выполнении исключающего ИЛИ это число взять в качестве маски, то с операндом, равным 45000, в результате получим 20535. В двоичном представлении все нули операнда превратятся в единицы. Поскольку все биты второго операнда, или маски, равны 1, операция поразрядного исключающего ИЛИ эффективно переключает первоначальные значения всех разрядов первого операнда на противоположные. Теперь будет интересно повторить эксперимент с той же самой маской, но взяв в качестве первого операнда результат предыдущего теста. Запустим снова TXOR и введем числа 2053 и -1 (разделенные одним пробелом). На этот раз программа отобразит следующее:

20535 0х5037 0101000000110111

XOR 65535 0xffff 1111111111111111

====================================

45000 0xafc8 1010111111001000

Применение маски, равной -1, к результату предыдущего эксперимента восстановило первоначальный операнд 45000. Этот факт справедлив для единичных разрядов любой маски, а не только равной -1. Выполнение операторов

С = А ^ В;

D = С ^ В;

установит переменную D равной первоначальному значению А.

Это свойство часто приносит пользу в мультипликации, гдe образы хранятся в памяти в виде битовых шаблонов (называемых битовыми образами). Отображение образа с помощью операции исключающего ИЛИ над его разрядами с битовым образом фона и использование аналогичной операции с теми же разрядами снова восстановит первоначальный образ. Это дает визуальный эффект независимого движения одного образа поверх другого.

Рис. 2.3. Результат операции исключающего ИЛИ над операндом и маской

Рис. 2.3 иллюстрирует результат применения маски к значению операнда при использовании оператора исключающего ИЛИ. Разряды маски, равные 1, переключают значения битов операнда на противоположные. Нулевые биты маски позволяют соответствующим битам операнда перейти в результат без изменений.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]