побитовото Operaторове в C: И, ИЛИ, XOR, Shift & Допълване
⚡ Умно обобщение
Битовите оператори в C манипулират данни на ниво отделен бит, използвайки AND, OR, XOR, операции за допълване и изместване върху целочислени операнди, за да извършват по-бързи изчисления, да пакетират флагове и да контролират хардуера в ниско ниво и вградено програмиране.
Какво представляват побитовите Operaторове?
побитовото OperaПрограмите се използват за манипулиране на данни на битово ниво, наричано още програмиране на битово ниво. Побитовото програмиране работи с един или повече битови шаблони или двоични числа на ниво техните отделни битове. Те се използват в числените изчисления, за да ускорят процеса на изчисление.
Следва списъкът с побитови оператори, осигурен от езика за програмиране C:
| OperaTor | Значение |
|---|---|
| & | Побитово И оператор |
| | | Побитов оператор ИЛИ |
| ^ | Побитово изключителен оператор ИЛИ |
| ~ | Допълнение към двоично единица Operator е унарен оператор |
| << | Оператор на лява смяна |
| >> | Оператор на дясна смяна |
Побитовите оператори не могат да се прилагат директно към примитивни типове данни като float, double и др. Винаги помнете едно нещо, че побитовите оператори се използват най-вече с тип данни цяло число поради неговата съвместимост.
Побитовите логически оператори работят върху данните бит по бит, започвайки от най-малкия бит, т.е. LSB бит, който е най-десният бит, работейки към MSB (Most Significant Bit), който е най-левият бит.
Резултатът от изчислението на побитовите логически оператори е показан в таблицата по-долу.
| x | y | x & y | x | г | 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
Резултатът от операцията И върху променливи 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
Оператори за побитово преместване
Операторите за побитово изместване се използват за преместване/изместване на битовите шаблони наляво или надясно. „Left“ и „Right“ са два оператора за изместване, предоставени от „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
Shifts операторите могат да се комбинират, след което могат да се използват за extracданните от целочисления израз. Нека напишем програма, която да демонстрира използването на оператори за побитово изместване.
#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 стават 0 и обратно.
Ако имаме целочислен израз, който съдържа 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

