C Побітові оператори: AND, OR, XOR, операції доповнення та зсуву

У цьому посібнику ви дізнаєтесь про всі 6 розрядних операторів програмування на С на прикладах.

В арифметико-логічному блоці (який знаходиться в центральному процесорі) такі математичні операції, як: додавання, віднімання, множення та ділення, виконуються на рівні бітів. Для виконання операцій на бітовому рівні в програмуванні на С використовують побітові оператори.

Оператори Значення операторів
& Побітове І
| Побітове АБО
^ Побітовий XOR
~ Побітове доповнення
<< Зрушення вліво
>> Зрушити вправо

Побітове І оператор &

Вихід побітового І дорівнює 1, якщо відповідні біти двох операндів дорівнюють 1. Якщо будь-який біт операнда дорівнює 0, результат відповідного біта обчислюється як 0.

Припустимо, побітова операція І роботи двох цілих чисел 12 і 25.

 12 = 00001100 (у двійковому) 25 = 00011001 (у двійковому) Бітова операція 12 та 25 00001100 & 00011001 ________ 00001000 = 8 (у десятковому)

Приклад №1: Побітове І

 #include int main() ( int a = 12, b = 25; printf("Output = %d", a&b); return 0; ) 

Вихідні дані

 Вихід = 8

Побітовий оператор АБО

Вихід побітового АБО дорівнює 1, якщо принаймні один відповідний біт двох операндів дорівнює 1. У програмуванні на С оператор побітового АБО позначається |.

12 = 00001100 (у двійковому) 25 = 00011001 (у двійковому) Побітове АБО Операція 12 та 25 00001100 | 00011001 ________ 00011101 = 29 (у десяткових)

Приклад №2: Побітове АБО

 #include int main() ( int a = 12, b = 25; printf("Output = %d", a|b); return 0; ) 

Вихідні дані

 Вихід = 29

Побітовий оператор XOR (ексклюзивний АБО) ^

Результат побітового оператора XOR дорівнює 1, якщо відповідні біти двох операндів протилежні. Він позначається ^.

 12 = 00001100 (у двійковому) 25 = 00011001 (у двійковому) Побітове XOR Операція 12 та 25 00001100 00011001 ________ 00010101 = 21 (у десятковому)

Приклад №3: Побітове XOR

 #include int main() ( int a = 12, b = 25; printf("Output = %d", a^b); return 0; )

Вихідні дані

 Вихід = 21

Оператор бітового доповнення ~

Побітовий оператор компліментів - це унарний оператор (працює лише на одному операнді). Він змінюється від 1 до 0 і від 0 до 1. Позначається ~.

 35 = 00100011 (у двійковому) Побітове доповнення Операція 35 ~ 00100011 ________ 11011100 = 220 (у десятковому) 

Покрутіть в побітовому операторі доповнення в програмуванні на C.

Побітове доповнення 35 (~ 35) дорівнює -36 замість 220, але чому?

Для будь-якого цілого числа n побітове доповнення n буде -(n+1). Щоб зрозуміти це, ви повинні знати доповнення 2.

Доповнення 2

Доповнення двох - це операція над двійковими числами. Доповнення числа 2 дорівнює доповненню цього числа плюс 1. Наприклад:

 Десятковий двійковий додаток 2 0 00000000 - (11111111 + 1) = -00000000 = -0 (десятковий) 1 00000001 - (11111110 + 1) = -11111111 = -256 (десятковий) 12 00001100 - (11110011 + 1) = -11110100 = -244 (десятковий) 220 11011100 - (00100011 + 1) = -00100100 = -36 (десятковий) Примітка: Переповнення ігнорується під час обчислення доповнення 2. 

Побітове доповнення 35 дорівнює 220 (у десяткових). Додаток 2 із 220 - -36. Отже, результат дорівнює -36 замість 220.

Побітове доповнення будь-якого числа N є - (N + 1). Ось як:

 побітове доповнення N = ~ N (представлене у формі доповнення 2) 2'доповнення ~ N = - (~ (~ N) +1) = - (N + 1) 

Приклад №4: Побітове доповнення

 #include int main() ( printf("Output = %d",~35); printf("Output = %d",~-12); return 0; ) 

Вихідні дані

 Вихід = -36 Вихід = 11

Оператори зсуву в програмуванні на Сі

There are two shift operators in C programming:

  • Right shift operator
  • Left shift operator.

Right Shift Operator

Right shift operator shifts all bits towards right by certain number of specified bits. It is denoted by>>.

 212 = 11010100 (In binary) 212>>2 = 00110101 (In binary) (Right shift by two bits) 212>>7 = 00000001 (In binary) 212>>8 = 00000000 212>>0 = 11010100 (No Shift) 

Left Shift Operator

Left shift operator shifts all bits towards left by a certain number of specified bits. The bit positions that have been vacated by the left shift operator are filled with 0. The symbol of the left shift operator is <<.

 212 = 11010100 (In binary) 212<<1 = 110101000 (In binary) (Left shift by one bit) 212<<0 = 11010100 (Shift by 0) 212<<4 = 110101000000 (In binary) =3392(In decimal)

Example #5: Shift Operators

 #include int main() ( int num=212, i; for (i=0; i>i); printf(""); for (i=0; i<=2; ++i) printf("Left shift by %d: %d", i, num< 
 Right Shift by 0: 212 Right Shift by 1: 106 Right Shift by 2: 53 Left Shift by 0: 212 Left Shift by 1: 424 Left Shift by 2: 848 

Цікаві статті...