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

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


Содержание



1. Для каких типов можно применять логические операции, поразрядные логические операции и операции сдвига?

Логические операции, поразрядные логические операции и операции сдвига можно использовать только для операндов целых типов.

2. Какие логические операции используются в C/C++?

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

  • && – логическое «И»;
  • || – логическое «ИЛИ»;
  • ! – логическое «НЕТ».

Результатом логических операций есть значение false или true. В языке C++ принято, что значение false считается равным 0, а значение true считается равным 1.

Отсюда можно сделать вывод, что false < true. Например:

// логические операции
bool res;

res = false < true; // res = true

3. Таблица истинности логических операций

Таблица истинности логических операций && (логическое «И»), || (логическое «ИЛИ»), ! (логическое «НЕТ») имеет следующий вид:

C++ логические операции таблица

В языке C/C++ принимается, что значение false равно 0, а значение true не равно 0 (любое ненулевое целочисленное значение).

 

4. Примеры использования логических операций в C++

Пример 1. Логическая операция в сочетании с логическим выражением

// логические операции
bool res;
int a, b;

// операция && (AND)
a = 8;
b = 5;
res = a && b; // res = True

a = 0;
res = a && b; // res = False

// операция || (OR)
a = 0;
b = 0;
res = a || b; // res = False

b = 7;
res = a || b; // res = True

// операция ! (логическое "НЕТ")
a = 0;
res = !a; // res = True

a = 15;
res = !a; // res = False

Пример 2. Логическая операция в условных выражениях. Приведен фрагмент кода, в котором логическая операция используется в операторе условного перехода if.

// логические операции в условных выражениях
int a, b;
bool res;

a = 0;
b = 3;
res = false;
if (a && b)
    res = true; // res = false

a = 0;
b = 7;
if (a || b)
    res = true; // res = true

5. Какие поразрядные логические операции используются в C/C++?

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

  • & – поразрядное логическое И (AND);
  • ^ – поразрядное сложение по модулю 2 (XOR — исключающее ИЛИ);
  • | – поразрядное логическое ИЛИ (OR);
  • ~ – поразрядная инверсия (NOT).

Операции &, ^, | есть бинарными. Это означает, что они требуют двух операндов. Биты любого операнда сравниваются между собой по следующему правилу:

  • бит в позиции 0 первого операнда сравнивается с битом в позиции 0 второго операнда. Затем бит в позиции 1 первого операнда сравнивается с битом в позиции 1 второго операнда. Так сравниваются все биты целочисленных операндов.

6. Таблица истинности поразрядных логических операций

Каждый бит результата определяется на основе двух операндов, которые являются битами, так как показано в таблице.

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

Инверсия требует единого операнда справа от знака ~. Результат получается поразрядной инверсией всех битов операнда.

7. Пример работы с логическими побитовыми операциями

Пусть даны два числа 17 и 45 типа unsigned short int. Каждое из чисел занимает в памяти 1 байт или 8 бит. Ниже приведен пример того, как происходит вычисление для каждой побитовой операции

C++ логические побитовые операции

Как видно из примера, происходит выполнение заданной операции над каждым битом.

8. Какие операции сдвига используются в C/C++?

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

  • << – сдвиг влево значения операнда на заданное количество бит. Операнд размещается слева от знака операции. Число сдвигаемых бит указывается справа от знака операции;
  • >> – сдвиг вправо значения операнда на заданное количество бит. Операнд размещается слева от знака операции (<<). Количество сдвигаемых бит размещается справа от знака операции.

Выдвижные биты теряются, а «входят» нулевые биты. Сдвиг операндов влево на 1, 2, 3 и более разрядов – наиболее быстрый способ умножения на 2, 4, 8, … Сдвиг операндов вправо на 1, 2, 3 и более разрядов – наиболее быстрый способ деления на 2, 4, 8, …

Если в программе нужно, чтобы операция умножения целочисленных операндов на 2, 4, 8 и т.д. происходила максимально быстро, то целесообразно использовать операцию сдвига влево.

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

9. Примеры использования операций сдвига в программе
// Операции сдвига
int a;
int b;
int c;

a = 15;
b = -5;

// сдвиг влево - умножение
c = a << 1; // c = a * 2^1 = 30
c = b << 2; // c = b * 2^2 = -20

// сдвиг вправо - деление
c = a >> 3; // c = a / 2^3 = 1
c = b >> 1; // c = b / 2^1 = -3

10. Какое отличие между логическими операциями и поразрядными логическими операциями?

В логических операциях сравнивается значение двух операндов целиком. Каждый из операндов может иметь значение true или false. Язык C/C++ допускает сравнение операндов, которые являются целыми числами. В этом случае целочисленное значение 0 соответствует значению false, а ненулевое (любое другое) значение соответствует значению true.

Поразрядные логические операции работают строго с битами любого операнда. Бит может иметь 2 значения: 0 или 1. Поэтому, вычислению подлежат соответствующие биты каждого операнда а не значение операнда в целом.

11. Как в C++ реализовать логическую операцию XOR?

Как известно, язык C++ не содержит встроенной логической операции XOR (исключающее «ИЛИ»).

Ниже приведен фрагмент кода, который реализует операцию XOR с помощью использования операций && (AND), || (OR), ! (NOT).

// реализация операции XOR через операции && (AND), || (OR), ! (NOT)
bool x, y;
bool res;

...

res = (x || y) && !(x && y);

...

В вышеприведенном программном коде:

  • x, y – переменные, для которых вычисляется операция XOR;
  • res – переменная, которая есть результатом вычисления.


Связанные темы