Побітовий Operaтори в C: AND, OR, XOR, Shift & Доповнити

Що таке побітові Operaторс?

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

Нижче наведено список порозрядних операторів, наданих мовою програмування C:

Operaтор Сенс
& Порозрядний оператор І
| Побітовий оператор АБО
^ Побітовий виключаючий оператор АБО
~ Двійкове доповнення одиниці Operator є унарним оператором
<< Оператор лівої зміни
>> Оператор правого зсуву

Побітові оператори не можна безпосередньо застосовувати до простих типів даних, таких як float, double тощо. Завжди пам’ятайте одну річ: побітові оператори переважно використовуються з цілочисельним типом даних через його сумісність.

Порозрядні логічні оператори працюють з даними побітово, починаючи з молодшого біта, тобто LSB-біта, який є крайнім правим бітом, працюючи до MSB (Most Significant Bit), який є крайнім лівим бітом.

Результат обчислення порозрядних логічних операторів показано в таблиці нижче.

x y x & y х | там x^y
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0

Побітові І

Це один із найбільш часто використовуваних логічних побітових операторів. Він представлений одним знаком амперсанда (&). З кожного боку оператора (&) записуються два цілих вирази.
Результатом порозрядної операції І є 1, якщо обидва біти мають значення 1; інакше результат завжди 0.

Припустімо, що ми маємо 2 змінні op1 і op2 з такими значеннями:

Op1 = 0000 1101
Op2 = 0001 1001

Результатом операції AND над змінними op1 і op2 буде

Result = 0000 1001

Як бачимо, дві змінні порівнюються поступово. Щоразу, коли значення біта в обох змінних дорівнює 1, тоді результат буде 1 або 0.

Побітові АБО

Він представлений одним вертикальним знаком (|). З кожного боку оператора (|) записуються два цілих вирази.

Результатом операції порозрядного АБО є 1, якщо принаймні один із виразів має значення 1; інакше результат завжди 0.

Припустімо, що ми маємо 2 змінні op1 і op2 з такими значеннями:

Op1 = 0000 1101
Op2 = 0001 1001

Результатом операції АБО над змінними op1 і op2 буде

Result = 0001 1101

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

Побітове виключне АБО

Він позначається символом (^). З кожного боку оператора (^) записуються два цілих вирази.

Результатом порозрядної операції виключного АБО є 1, якщо лише один вираз має значення 1; інакше результат завжди 0.

Припустімо, що ми маємо 2 змінні op1 і op2 з такими значеннями:

Op1 = 0000 1101
Op2 = 0001 1001

Результатом операції XOR над змінними op1 і op2 буде

Result = 0001 0100

Як бачимо, дві змінні порівнюються поступово. Якщо лише одна змінна має значення 1, тоді результатом буде 0, інакше результатом буде 0.

Давайте напишемо просту програму, яка демонструє побітові логічні оператори.

#include <stdio.h>
int main() 
{
int a = 20;	/* 20 = 010100 */  
int b = 21;	/* 21 = 010101 */
int c = 0;           

c = a & b;       /* 20 = 010100 */ 
printf("AND - Value of c is %d\n", c );

c = a | b;       /* 21 = 010101 */
printf("OR - Value of c is %d\n", c );

c = a ^ b;       /* 1 = 0001 */
printf("Exclusive-OR - Value of c is %d\n", c );

getch();
}

вихід:

AND - Value of c is 20
OR - Value of c is 21
Exclusive-OR - Value of c is 1

Оператори побітового зсуву

Оператори побітового зсуву використовуються для переміщення/зсуву бітових шаблонів ліворуч або праворуч. Ліворуч і праворуч два оператори зсуву, надані 'C', які представлені таким чином:

Operand << n (Left Shift)
Operand >> n (Right Shift)

Тут,

  • операнд - це цілочисельний вираз, над яким ми повинні виконати операцію зсуву.
  • 'n' - це загальна кількість бітових позицій, які ми повинні зсунути в цілочисельному виразі.

Операція зсуву вліво зсуне число «n» бітів вліво. Крайні ліві біти у виразі буде висунуто, а n бітів із значенням 0 буде заповнено праворуч.

Операція зсуву вправо зсуне число «n» бітів вправо. Крайні праві 'n' бітів у виразі будуть висунуті, а значення 0 буде заповнено зліва.

Приклад: x — цілочисельний вираз із даними 1111. Після виконання операції зсуву результатом буде:

x << 2 (left shift) = 1111<<2 = 1100
x>>2 (right shift) = 1111>>2 = 0011

ShiftОператори s можна комбінувати, тоді їх можна використовувати для вилучення даних із цілочисельного виразу. Давайте напишемо програму, щоб продемонструвати використання операторів побітового зсуву.

#include <stdio.h>
int main() {
int a = 20;	/* 20 = 010100 */  
int c = 0;           

c = a << 2;	/* 80 = 101000 */
printf("Left shift - Value of c is %d\n", c );

c = a >> 2;	/*05 = 000101 */
printf("Right shift - Value of c is %d\n", c );
return 0;
}

вихід:

Left shift - Value of c is 80
Right shift - Value of c is 5

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

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

Оператор порозрядного доповнення

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

Коли ми виконуємо доповнення до будь-яких бітів, усі 1 стають нулями і навпаки.

Якщо ми маємо цілочисельний вираз, який містить 0000 1111, то після виконання операції побітового доповнення значення стане 1111 0000.

Оператор побітового доповнення позначається символом тильда (~).

Напишемо програму, яка демонструє реалізацію оператора побітового доповнення.

#include <stdio.h>
int main() {
int a = 10;	/* 10 = 1010 */  
int c = 0;           
c = ~(a);      
printf("Complement - Value of c is %d\n", c );
return 0;
}

вихід:

Complement - Value of c is -11

Ось ще одна програма з прикладом усіх обговорених досі операцій:

#include <stdio.h>
main() {
unsigned int x = 48;	/* 48 = 0011 0000 */  
unsigned int y = 13;	/* 13 = 0000 1101 */
int z = 0;           

z =x & y;       /* 0 = 0000 0000 */ 
printf("Bitwise AND Operator - x & y = %d\n", z );

z = x | y;       /* 61 = 0011 1101 */
printf("Bitwise OR Operator - x | y = %d\n", z );

z= x^y;       /* 61 = 0011 1101 */
printf("Bitwise XOR Operator- x^y= %d\n", z);

z = ~x;          /*-49 = 11001111 */
printf("Bitwise One's Complement Operator - ~x = %d\n", z);

z = x << 2;     /* 192 = 1100 0000 */
printf("Bitwise Left Shift Operator x << 2= %d\n", z );

z= x >> 2;     /* 12 = 0000 1100 */
printf ("Bitwise Right Shift Operator x >> 2= %d\n", z );}

Після того, як ми скомпілюємо та запустимо програму, вона дає такий результат:

Bitwise AND Operator - x & y = 0
Bitwise OR Operator - x | y = 61
Bitwise XOR Operator- x^y= 61
Bitwise One's Complement Operator - ~x = -49
Bitwise Left Shift Operator x << 2= 192
Bitwise Right Shift Operator x >> 2= 12

Підсумки

  • Побітові оператори — це спеціальний набір операторів, наданий «C».
  • Вони використовуються в програмуванні на бітовому рівні.
  • Ці оператори використовуються для маніпулювання бітами цілого виразу.
  • Логічний, зсув і доповнення є трьома типами побітових операторів.
  • Оператор побітового доповнення використовується для зміни бітів виразу.