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 – змінна, що є результатом обчислення.


Зв’язані теми