В С++ существуют три поразрядные логические операции:
- поразрядное И, обозначение:
&
- поразрядное исключающее ИЛИ, обозначение:
^
- поразрядное включающее ИЛИ, обозначение:
|
Так же в С++ существуют логические операции: ИЛИ — ||
; И — &&
. У многих возникает вопрос, “Чем отличаются операции: &
и &&
; |
и ||
?”. Ответ на этот вопрос можно получить, если понять принцип работы поразрядных логических операций. Сразу могу сказать одно, что логические операции &&
и ||
используются только для построения логических условий. Тогда как поразрядные логические операции применяются в бинарной арифметике. Данные операции работают с битами ячеек памяти, причём операнды и результат могут быть заданы в другой форме, например, в десятичной. Дальше рассмотрим каждую из операций подробно.
Поразрядная логическая операция И.
Обозначения: X, Y – операнды; F – результат выполнения логической операции
X | Y | F |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
Из таблицы истинности видно, что результат будет нулевым, если хотя бы один из битов 0. Если оба бита равны 1, то результат равен 1.
Пример с числами:
Для упрощения вычислений возьмем четырёхразрядные(4-х разрядный двоичный код) положительные операнды. Сначала переводим числа в двоичный код, а потом выполняем операцию.
& 1001 = 9 & 1010 = 10
1001 = 9 1000 = 8
Результат равен 9. Результат равен 8.
Поразрядное исключающее ИЛИ.
X | Y | F |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Из таблицы истинности видно, что результат будет нулевым, если оба бита будут равны, во всех остальных случаях результат равен 1.
Пример с числами:
^ 1001 = 9 ^ 1010 = 10
0110 = 6 0010 = 2
Результат равен 6. Результат равен 2.
Поразрядное включающее ИЛИ.
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).
15 & 9 = 9 15 ^ 9 = 6 15 | 9 = 15 Для продолжения нажмите любую клавишу . . .
Рисунок 1 — Поразрядные логические операции C++
Комментарии
zhurov
Поразрядное логическое «И» — фраза «Не трудно заметить, что результат вычисления всегда равен наименьшему из операндов» — неверна, так же как и подобные заключения для OR и XOR.
Контрпример для AND: 8 & 1 = 0.
Контрпример для OR: 8 | 1 = 9.
Контрпример для XOR 8 ^ 1 = 9.
Valik Troyan
Можете объяснить пожалуйста, как так выходит?
sasha3ks
Что-то вот не понял, как это используется в реальных задачах…
admin
Что именно?
sasha3ks
Ну вот где в реальных задачах можно использовать обычные логические операции я в общем понял. А вот как и где используются поразрядные никак не могу понять…
admin
Используются везде, где и бинарная логика, например, по защищенным каналам, перед передачей информации из точки А в точку В, её сначала шифруют. А алгоритмы шифрования работают с битами.