Логічні операції. Операції відношення. Порозрядні логічні операції

Логічні операції. Операції відношення. Порозрядні логічні операції


Зміст



1. Які логічні операції використовуються в програмах на Java?

В мові Java крім логічних операцій, операцій відношення та порозрядних логічних операцій також існують такі групи операцій:

Логічні операції виконуються тільки над операндами типу boolean (на відміну від порозрядних логічних операцій).

Опис наявних логічних операцій наведено нижче.

Операція     Опис
-----------------------------------
   &         Логічна операція "І"
   |         Логічна операція "АБО"
   ^         Логічна операція виключне "АБО"
   ||        Скорочена логічна операція "АБО"
   &&        Скорочена логічна операція "І"
   !         Унарна логічна операція "НІ"
   &=        Логічна операція "І" з присвоюванням
   |=        Логічна операція "АБО" з присвоюванням
   ^=        Логічна операція виключне "АБО" з присвоюванням
   ==        Дорівнює
   !=        Не дорівнює
   ?:        Тернарна логічна операція "якщо...то...інакше"

2. Який результат дає застосування логічних операцій !, &, |, ^

Результати виконання порозрядних логічних операцій !, &, |, ^ наведено нижче:

----------------------------------------
  X      Y     X|Y    X&Y    X^Y    !X
----------------------------------------
false  false  false  false  false  true
true   false  true   false  true   false
false  true   true   false  true   true
true   true   true   true   false  false
----------------------------------------

3. Приклади використання логічних операцій ~, &, |, ^
// логічні операції
boolean b1, b2, b3;

b1 = true;
b2 = false;

b3 = b1 & b2; // b3 = false
b3 = !b1;     // b3 = false
b3 = b1 | b2; // b3 = true
b3 = b1 ^ b2; // b3 = true

4. Які переваги дає використання скорочених логічних операцій && та ||

Скорочені логічні операції && та || дозволяють скоротити час обчислення довгих логічних виразів.

При використанні операції &&, якщо значення першого операнду рівне false, то немає потреби обчислювати другий операнд, тому що результат буде все одно false.

Аналогічно, при використанні операції ||, якщо значення першого операнду рівне true, то результат усього логічного виразу буде рівний true. Отже, немає потреби обчислювати другий операнд.

Оскільки, в операціях обчислюється тільки один (перший) операнд, то підвищується ефективність коду.

Скорочені логічні операції можна ефективно використовувати в коді. Наприклад, коли від значення першого операнду залежить необхідність обчислення другого операнду. У цьому випадку значення другого операнду не обчислюється.

5. Які операції відношення використовуються в Java?

Операції відношення ще називають операціями порівняння.

Операції відношення дозволяють порівнювати два операнди між собою.

Результатом операції відношення є логічне значення (boolean).

Найчастіше операції відношення використовуються в управляючих операторах умовного переходу if та операторах циклу.

У Java підтримуються такі операції відношення:

Операція     Опис
-------------------------------
   ==        Дорівнює
   !=        Не дорівнює
   >         Більше
   <         Менше
   >=        Більше або рівне
   <=        Менше або рівне

6. Приклади використання операцій відношення

При порівнянні двох значень отримується результат типу boolean, який може приймати два значення true (істина) або false (фальш).

Приклад 1. Демонстрація операцій відношення.

// демонстрація операцій порівняння
int x, y;
boolean b;

x = 8;
y = -5;

b = x>y; // b = true, операція '>' більше
b = x<(y+3); // b = false, операція '<' менше
b = x == 3-y; // b = true, операція '==' дорівнює
b = x != 0;  // b = true, операція '!=' не дорівнює
b = x >= 8;  // b = true, операція '>=' більше або рівне
b = x+y <= 2; // b = false, операція '<=' менше або рівне

Приклад 2. Фрагмент розв’язку квадратного рівняння, в якому показано використання операцій відношення в операторі умовного переходу if.

// фрагмент розв’язку квадратного рівняння
int a, b, c;
double d, x1, x2;

// ввід значень a, b, c
// ...

d = b*b - 4*a*c;

if (d>=0)
{
    if (a!=0)
    {
        x1 = (-b - Math.sqrt(d))/(2*a);
        x2 = (-b + Math.sqrt(d))/(2*a);
        System.out.println("x1 = " + x1);
        System.out.println("x2 = " + x2);
    }
    else
    {
        x1 = x2 = (double)-c / (double)b;
        System.out.println("x1 = x2 = " + x1);
    }
}
else
{
    System.out.println("Рівняння не має розв'язку");
}

7. Які особливості застосування порозрядних логічних операцій в Java?

Групи операцій, що підтримуються мовою Java, детально описуються тут.

Порозрядні операції можна виконувати тільки над цілочисельними операндами. Ці операції діють на окремі двійкові операнди.

У Java є наступні порозрядні логічні операції

Операція     Опис
-----------------------------------------------------
   ~         Порозрядна унарна операція "НІ"
   &         Порозрядна логічна операція "І"
   |         Порозрядна логічна операція "АБО"
   ^         Порозрядна логічна операція виключне "АБО"
   >>        Зсув вправо
   >>>       Зсув вправо з заповненням нулями
   <<        Зсув вліво
   &=        Порозрядне логічне "І" з присвоюванням
   |=        Порозрядне логічна "АБО" з присвоюванням
   ^=        Порозрядне логічне виключне "АБО" з присвоюванням
   >>=       Зсув вправо з присвоюванням
   >>>=     Зсув вправо з заповненням нулями і присвоюванням
   <<=       Зсув вліво з присвоюванням
-----------------------------------------------------

8. Який результат дає застосування порозрядних логічних операцій ~, &, |, ^

Результати виконання порозрядних логічних операцій ~, &, |, ^:

--------------------------------------
  X    Y    X|Y    X&Y    X^Y    ~X
--------------------------------------
  0    0     0      0      0      1
  1    0     1      0      1      0
  0    1     1      0      1      1
  1    1     1      1      0      0
--------------------------------------

9. Використання порозрядної логічної операції ~ (НІ). Приклад

Порозрядна логічна операція ~ є унарною. При її використанні усі двійкові розряди інвертуються.

Приклад.

int a, b;

a = 65;
b = ~a; // b = -66

a = -66;
b = ~a; // b = 65

10. Використання порозрядної логічної операції & (І). Приклад

Логічне “І” ще відоме як логічне множення.

Таблиця результатів для двох бітових значень має вигляд:

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

Згідно з цією таблицею відбувається побітове логічне “І” над операндами цілих чисел.

Наприклад. Для двох чисел 25 і 18 побітове “І” дасть такий результат

00011001    = 25
00010010    = 18
----------------
00010000    = 16

Приклад застосування побітового “І” в програмі на Java:

// побітове логічне "І"
byte a, b, c;

a = 25;
b = 18;
c = (byte)(a & b);  // c = 16

a = -20;
b = 10;
c = (byte)(a & b);  // c = 8

11. Використання порозрядного логічного “АБО“. Приклад

Операція порозрядного логічного “АБО” є бінарною (вимагає двох операндів).

Порозрядне логічне “АБО” позначається як ‘ | ‘. Логічне “АБО” ще називається логічним додаванням.

При виконанні даної операції формується значення, яке є результатом побітового логічного “АБО” відповідних розрядів кожного операнду.

Операція ‘ | ‘ для двох розрядів дає результат відповідно до наступної таблиці:

0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1

Наприклад. Для операндів 25 і 18 побітове “АБО” дасть результат

00011001    = 25
00010010    = 18
----------------
00011011    = 27

Приклад застосування побітового “АБО” в програмі на Java:

// побітове логічне "АБО"
byte a, b, c;

a = 25;
b = 18;
c = (byte)(a | b);  // c = 27

a = -20;
b = 10;
c = (byte)(a | b);  // c = -18

12. Використання побітового виключного “АБО

Операція побітового виключного “АБО” є бінарною (вимагає двох операндів).

В Java побітове виключне “АБО” позначається символом ‘^‘.

Операція ‘^‘ для двох розрядів дає результат відповідно до наступної таблиці:

0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 0

Для операндів 25 і 18 виключне “АБО” дасть результат

00011001    = 25
00010010    = 18
----------------
00001011    = 11

Приклад застосування побітового “АБО” в програмі на Java:

// побітове виключне "АБО"
byte a, b, c;

a = 25;
b = 18;
c = (byte)(a ^ b);  // c = 11

a = -20;
b = 10;
c = (byte)(a ^ b);  // c = -26

13. Як в Java представлені від’ємні цілочисельні значення?

У мові програмування Java усі цілочисельні типи даних можуть мати знак числа, тобто бути додатними і від’ємними.

Від’ємні числа представлені в додатковому коді.

Алгоритм утворення від’ємного числа з додатного такий:

  • усі двійкові розряди інвертуються (0 змінюється на 1 і навпаки);
  • до отриманого значення додається 1.

Приклад 1. Представлення числа -8 з додатного числа 8. Числа мають тип byte. Як відомо, значення типу byte мають 8 розрядів (біт).

Додатне число 8   => 00001000
Інвертування      => 11110111
+ 1               => 11111000 => -8

Приклад 2. Представлення числа 8 з від’ємного числа -8.

Від’ємне число -8 => 11111000
Інвертування      => 00000111
+ 1               => 00001000 => 8

Якщо зробити перевірку: 8 + (-8) = 0.

        00001000 =>  8
    +   11111000 => -8
-----------------------------
Сума => 00000000 =>  0

14. Особливості використання операції зсуву вліво (<<)

Операція зсуву вліво зсуває усі двійкові розряди вліво на задану кількість позицій. Загальна форма операції зсуву вліво:

значення << кількість;

де кількість – це кількість позицій, на які потрібно зсунути розряди в величині значення.

При зсуві вліво, самий старший двійковий розряд зміщується за межі допустимого діапазону значень і втрачається. З правої сторони додається нуль.

Зсув вліво на n позицій означає множення числа на 2 в степені n.

Якщо зсуваються значення типів byte і short, то спочатку вони автоматично приводяться до типу int. Тому, зсунуті вліво розряди не втрачаються в межах розрядності типу int (тип int має більший розмір ніж типи byte та short).

Крім того, при приведенні до типу int від’ємне значення типів byte та short зберігається (зберігається старший розряд).

Треба бути обережним при зсуві значень типів byte та short.

Приклад.

Зсув числа 27 вліво на 1 розряд має вигляд:

00011011 = 27
<<         1
------------
00110110 = 54 = 27*2¹

Зсув числа 11 на 3 розряди вліво:

00001011 = 11
<<         3
------------
01011000 = 88 = 11*2³

15. Особливості використання операції зсуву вправо (>>)

Операція зсуву вправо зсуває усі двійкові розряди вправо на задану кількість позицій. Загальний вигляд операції зсуву вправо:

значення >> кількість;

де

кількість – це кількість позицій, на які потрібно змістити вправо розряди величини значення.

При зсуві вправо на одну позицію, самий молодший двійковий розряд зміщується вправо і втрачається.

Старший розряд (якщо число додатнє) доповнюється нулем.

Якщо число від’ємне, то старший розряд доповнюється одиницею. Це називається розширенням знаку.

Зсув вправо на n позицій означає ділення числа на 2 в степені n.

Приклад.

Зсув вправо числа 27 на 2 розряди:

00011011 = 27
>>         1
------------
00000110 =  6 = 27/2¹

Зсув вправо на 1 розряд числа 100:

01100100 = 100
>>         1
------------
00110010 =  50 = 100/2¹

Приклад зсуву вправо від’ємного числа. Знак числа (старший розряд) зберігається.

11111000 = -8
>>         1
------------
11111100 = -4

16. Приклад використання операцій зсуву вліво та зсуву вправо в Java.
// зсув вліво
byte a, b;

a = 27;
b = (byte)(a << 1); // b = 54

a = 18;
b = (byte)(a<<2); // b = 72

// зсув вправо
a = 15;
b = (byte)(a >> 2); // b = 3

a = 88;
b = (byte)(a>>2); // b = 22

17. Які особливості застосування операції зсуву вправо з заповненням нулями (>>>)

У попередніх пунктах було визначено, що при зсуві вправо (>>), знак числа зберігається. Тобто, якщо число від’ємне, то старший розряд доповнюється одиницею.

Інколи потрібно, щоб при зсуві вправо знак числа не розширювався. Тобто, потрібно виконати беззнаковий зсув. Для цього в Java передбачено операцію зсуву вправо з заповненням нулями, яка позначається >>>. Цю операцію ще називають беззнаковий зсув вправо.

Приклад.

// зсув вправо зі збереженням знаку
int a, b;

a = -5;
b = a >> 2; // b=-2 - знак зберігається

// зсув вправо з заповненням нулями
b = a >>> 2; // b=1073741822 - знак втрачається

18. Як в Java застосовуються складені операції зсуву з присвоюванням? Приклад

В Java є наступні операції зсуву з присвоюванням:

Операція     Опис
---------------------------------------------------
   &=        Порозрядне логічне "І" з присвоюванням
   |=        Порозрядне логічна "АБО" з присвоюванням
   ^=        Порозрядне логічне виключне "АБО" з присвоюванням
   >>=       Зсув вправо з присвоюванням
   >>>=      Зсув вправо з заповненням нулями і присвоюванням
   <<=       Зсув вліво з присвоюванням

Ці операції є аналогічні операціям:

&   – логічне побітове "І"
|   – логічне побітове "АБО"
^   – логічне побітове виключне "АБО"
>>  – побітовий зсув вправо
<<  – побітовий зсув вліво
>>> – побітовий зсув вправо з заповненням нулями

Приклад.

// порозрядні складені операції з присвоюванням
int a, b, c;

a = 15;
b = 22;
b &= a; // b = b & a, b = 6

b = 22;
b |= a; // b = b | a, b = 31

b = 22;
b ^= a; // b = b ^ a, b = 25

b = -22;
b >>= 1; // b = b >> 1; b = -11

b = -22;
b <<= 1; // b = b << 1; b = -44

b = -22;
b >>>= 1; // b = 2147483637


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