Таблица 4.4. Таблица истинности оператора |
| 1 0
1 1 1
0 1 0
Для последнего логического оператора, называемого "исключающее или" ( XOR ), прямой аналог в повседневной жизни найти труднее. Он возвращает значение true, если истинным является какой-то один ( но не оба! ) из его аргументов. Таблица истинности этого оператора представлена ниже ( табл. 4.5 ).
Таблица 4.5. Таблица истинности оператора ^
^ 1 0
1 0 1
0 1 0
Теперь, зная, как работают эти операторы с отдельными битами, рассмотрим их применение к двоичным числам.
Использование побитовых операторов...63
Побитовые операторы работают отдельно с каждым битом.
Побитовые операторы выполняются подобно любым другим арифметическим операторам. Самым лёгким для понимания является оператор ~ . Выполнить операцию ~ над числом означает выполнить её над каждым битом числа.
~01102 ( 0х6 )
10012 ( 0x9 )
Таким образом получаем, что ~0x6 равно 0x9. В следующем примере продемонстрировано выполнение оператора &:
01102
&
00112
00102
Вычисляем, начиная со старших битов: 0 & 0 равно 0. В следующем бите 1 & 0 равно 0. В третьем бите 1 & 1 даёт 1, а в последнем бите 0 & 1 даёт 0.
_________________
63 стр. Глава 4. Выполнение логических операций
Те же вычисления могут быть выполнены в шестнадцатеричной системе. Для этого нужно преобразовать числа в двоичное представление, выполнить операцию и преобразовать результат обратно.
0x06 01102
& &
0x03 00112
0x02 00102
Расписав числа таким образом, мы получили, что 0x6 & 0x3 равно 0x2. ( Попробуйте подсчитать значение выражения 0х6 | 0x3. Если вам это удастся, вы почувствуете себя на седьмом небе. Иначе очутитесь на первой из семи ступенек в преисподнюю. У меня на это ушло чуть меньше восьми минут. )
Простой пример...64
Следующая программа иллюстрирует работу побитовых операторов. В ней инициируются две переменные, к которым применяются операции &, |, ~, ^. Результаты вычислений выводятся на экран.
/* BitTest — инициируются две переменные */
/* выводятся результаты выполнения */
/* операторов |, ^, ~ и & */
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std ;
int main( int nNumberofArgs , char* pszArgs[ ] )
{
/* отмена формата по умолчанию( десятичного ), или можно и так отменить cout.unsetf( cout.dec ) */
cout.unsetf( ios::dec ) ;
/* теперь можно установить вывод переменных в шестнадцатеричном виде */
/* установка вывода переменных в шестнадцатеричном виде, или можно и так cout.setf( cout.hex ) */
cout.setf( ios::hex ) ;
/* инициализация двух аргументов */
int nArg1 ;
nArg1 = 0x1234 ;
int nArg2 ;
nArg2 = 0x00ff ;
/* Выполнение логических операций */
/* Сначала применяем унарный оператор NOT */
cout << "Arg1 = 0x" << nArg1 << "\n" ;
cout << "Arg2 = 0x" << nArg2 << "\n" ;
cout << "~nArg1 = 0x" << ~nArg1 << "\n" ;
cout << "~nArg2 = 0x" << ~nArg2 << "\n" ;
/* Теперь — бинарные операторы */