- •Действия: что делает программа Глава 2 Выражения
- •Арифметические операторы
- •Замечание
- •Операторы отношений
- •Логические операторы
- •Оператор отрицания
- •Операторы инкремента и декремента
- •Поразрядные операторы
- •Поразрядный оператор исключающего или
- •Сдвиг битов влево
- •Дополнение до единицы
- •Сомр 44 0х002с 0000000000101100
- •Операторы присваивания
- •Выражения значений
- •Приоритеты операторов
Поразрядный оператор исключающего или
Оказывается, поразрядный оператор исключающего ИЛИ (^) обладает волшебными свойствами. Листинг 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, переключают значения битов операнда на противоположные. Нулевые биты маски позволяют соответствующим битам операнда перейти в результат без изменений.