побитовото Operaторове в C: И, ИЛИ, XOR, Shift & Допълване

Какво представляват побитовите 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

Оператори за побитово преместване

Операторите за побитово преместване се използват за преместване/преместване на битовите модели наляво или надясно. Отляво и отдясно са два оператора за смяна, предоставени от '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 операторите могат да се комбинират, след което могат да се използват за извличане на данните от целочисления израз. Нека напишем програма, която да демонстрира използването на оператори за побитово преместване.

#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

Oбобщение

  • Побитовите оператори са специален набор от оператори, предоставен от 'C.'
  • Те се използват в програмирането на битово ниво.
  • Тези оператори се използват за манипулиране на битове от израз на цяло число.
  • Логически, смяна и допълнение са три вида побитови оператори.
  • Операторът за побитово допълнение се използва за обръщане на битовете на израз.