Поразрядные логические операции C++

В С++ существуют три поразрядные логические операции:

  1. поразрядное И, обозначение: &
  2. поразрядное исключающее ИЛИ, обозначение:  ^
  3. поразрядное включающее ИЛИ, обозначение:  |

Так же в С++ существуют логические операции: ИЛИ — ||; И — &&. У многих возникает вопрос, “Чем отличаются операции: & и &&| и || ?”. Ответ на этот вопрос можно получить, если понять принцип работы поразрядных логических операций. Сразу могу сказать одно, что логические операции && и || используются только для построения логических условий. Тогда как поразрядные логические операции применяются в бинарной арифметике. Данные операции работают с битами ячеек памяти, причём операнды и результат могут быть заданы в другой форме, например, в десятичной.  Дальше рассмотрим каждую из операций подробно.

Поразрядная логическая операция И.
Обозначения: X, Y – операнды; F – результат выполнения логической операции

Таблица 1 — Таблица истинности поразрядного И
X Y   F
0 0 0
0 1 0
1 0 0
1 1 1

Из таблицы истинности видно, что результат будет нулевым, если хотя бы один из битов 0. Если оба бита равны 1, то результат равен 1.
Пример с числами:
Для упрощения вычислений возьмем четырёхразрядные(4-х разрядный двоичный код) положительные операнды. Сначала переводим числа в двоичный код, а потом выполняем операцию.

   1111 = 15                            1000 = 8
& 1001 = 9                          & 1010 = 10
1001 = 9                              1000 = 8
Результат равен 9.       Результат равен 8.

Поразрядное исключающее ИЛИ.

Таблица 2 — Таблица истинности поразрядного исключающего ИЛИ
X Y F
0 0 0
0 1 1
1 0 1
1 1 0

Из таблицы истинности видно, что результат будет нулевым, если оба бита будут равны, во всех остальных случаях результат равен 1.
Пример с числами:

   1111 = 15                           1000  = 8
^ 1001 = 9                           ^ 1010 = 10
0110 = 6                              0010 = 2
Результат равен 6.                Результат равен 2.

Поразрядное включающее ИЛИ.

Таблица 3 — Таблица истинности поразрядного включающего ИЛИ
X Y F
0 0 0
0 1 1
1 0 1
1 1 1

Из таблицы истинности видно, что результат будет нулевым, если оба бита будут равны 0, во всех остальных случаях результат равен 1.
Пример с числами:

  1111  = 15                             1000 = 8
1001 = 9                              | 1010 = 10
1111 = 15                             1010 = 10
Результат равен 15.              Результат равен 10.

Все вычисления проводились только с положительными числами, что же касается отрицательных чисел, то результат формируется несколько иначе, но это уже материал схемотехники а не программирования, а если честно, то ничего сложно там нет. Далее показан пример программы с использованием поразрядных логических операций.

// log.cpp: определяет точку входа для консольного приложения.

#include "stdafx.h"
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
       cout << "\n 15 & 9 = " << (15 & 9) << endl;
       cout << "\n 15 ^ 9 = " << (15 ^ 9) << endl;
       cout << "\n 15 | 9 = " << (15 | 9) << endl;
       system("pause");
       return 0;
}

// код Code::Blocks

// код Dev-C++

// log.cpp: определяет точку входа для консольного приложения.

#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
       cout << "\n 15 & 9 = " << (15 & 9) << endl;
       cout << "\n 15 ^ 9 = " << (15 ^ 9) << endl;
       cout << "\n 15 | 9 = " << (15 | 9) << endl;
       return 0;
}

При использовании поразрядных логических операций в  логических условиях результат получается такой же, как и при использовании логических операций &&   ||. И это понятно, так как логика у них одинакова!!

В С++ ложному условию соответствует нулевое значение, а истинному любое целое значение большее нуля.  Так что константы true  и false интерпретируются как целые числа, после чего поразрядные логические операции поразрядно формируют результат условия. Но прямое назначение поразрядных логических операций – это бинарная арифметика. Результат работы программы (см. Рисунок 1).

CppStudio.com
 15 & 9 = 9

 15 ^ 9 = 6

 15 | 9 = 15
Для продолжения нажмите любую клавишу . . .

Рисунок 1 — Поразрядные логические операции C++

Практика

К сожалению, для данной темы пока нет подходящих задач. Если у вас есть таковые на примете, отправте их по адресу: admin@cppstudio.com. Мы их опубликуем!

Автор: admin
Дата: 25.08.2012
Поделиться:

Комментарии

  1. zhurov

    Поразрядное логическое «И» — фраза «Не трудно заметить, что результат вычисления всегда равен наименьшему из операндов» — неверна, так же как и подобные заключения для OR и XOR.

    Контрпример для AND: 8 & 1 = 0.

    Контрпример для OR: 8 | 1 = 9.

    Контрпример для XOR 8 ^ 1 = 9.

  2. sasha3ks

    Что-то вот не понял, как это используется в реальных задачах…

    • admin

      admin

      Что именно?

      • sasha3ks

        Ну вот где в реальных задачах можно использовать обычные логические операции я в общем понял. А вот как и где используются поразрядные никак не могу понять…

      • admin

        admin

        Используются везде, где и бинарная логика,  например, по защищенным каналам, перед передачей информации из точки А в точку В, её сначала шифруют. А алгоритмы шифрования работают с битами.

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.