Выбрать главу

    Таблица 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" ;

         /* Теперь — бинарные операторы */