Bitowy Operatory w C: AND, OR, XOR, Shift & Komplement

Czym są bitowe Operatory?

Bitowy Operatorsy są używane do manipulowania danymi na poziomie bitowym, nazywane również programowaniem na poziomie bitowym. Programowanie bitowe działa na jednym lub większej liczbie wzorców bitowych lub cyfrach binarnych na poziomie ich poszczególnych bitów. Są używane w obliczeniach numerycznych w celu przyspieszenia procesu obliczeniowego.

Poniżej znajduje się lista operatorów bitowych dostępnych w języku programowania C:

OperaTor Znaczenie
& Operator bitowy AND
| Operator bitowy OR
^ Operator bitowy wyłącznego OR
~ Uzupełnienie binarnej jedynki Operator jest operatorem jednoargumentowym
<< Operator przesunięcia w lewo
>> Operator przesunięcia w prawo

Operatorów bitowych nie można bezpośrednio stosować do prymitywnych typów danych, takich jak float, double itp. Zawsze należy pamiętać, że operatorów bitowych używa się głównie do typów danych całkowitych ze względu na ich zgodność.

Operatory logiczne bitowe przetwarzają dane bit po bicie, zaczynając od bitu najmniej znaczącego, czyli LSB (bitu najbardziej znaczącego), który jest bitem najbardziej wysuniętym na prawo, i przechodząc do MSB (bitu najbardziej znaczącego), który jest bitem najbardziej wysuniętym na lewo.

Wynik obliczeń operatorów logicznych bitowych przedstawiono w tabeli poniżej.

x y x i y x | tak x^y
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0

Bitowe AND

Jest to jeden z najczęściej używanych logicznych operatorów bitowych. Jest reprezentowany przez pojedynczy znak ampersandu (&). Po każdej stronie operatora (&) zapisuje się dwa wyrażenia całkowite.
Wynikiem operacji bitowej AND jest 1, jeśli oba bity mają wartość 1; w przeciwnym razie wynikiem jest zawsze 0.

Rozważmy, że mamy 2 zmienne op1 i op2 o następujących wartościach:

Op1 = 0000 1101
Op2 = 0001 1001

Wynikiem operacji AND na zmiennych op1 i op2 będzie

Result = 0000 1001

Jak widzimy, dwie zmienne są porównywane krok po kroku. Ilekroć wartość bitu w obu zmiennych wynosi 1, wówczas wynikiem będzie 1 lub 0.

Bitowe OR

Jest on reprezentowany przez pojedynczy znak pionowej kreski (|). Po każdej stronie operatora (|) zapisano dwa wyrażenia całkowite.

Wynikiem operacji bitowej OR jest 1, jeśli przynajmniej jedno z wyrażeń ma wartość 1; w przeciwnym razie wynikiem jest zawsze 0.

Rozważmy, że mamy 2 zmienne op1 i op2 o następujących wartościach:

Op1 = 0000 1101
Op2 = 0001 1001

Wynikiem operacji OR na zmiennych op1 i op2 będzie

Result = 0001 1101

Jak widzimy, dwie zmienne są porównywane krok po kroku. Ilekroć wartość bitu w jednej ze zmiennych wynosi 1, wówczas wynikiem będzie 1 lub 0.

Wyłączne LUB bitowe

Jest on reprezentowany przez symbol (^). Po każdej stronie operatora (^) zapisano dwa wyrażenia całkowite.

Wynikiem operacji bitowej Exclusive-OR jest 1, jeśli tylko jedno z wyrażeń ma wartość 1; w przeciwnym razie wynikiem jest zawsze 0.

Rozważmy, że mamy 2 zmienne op1 i op2 o następujących wartościach:

Op1 = 0000 1101
Op2 = 0001 1001

Wynikiem operacji XOR na zmiennych op1 i op2 będzie

Result = 0001 0100

Jak widzimy, dwie zmienne są porównywane krok po kroku. Ilekroć tylko jedna zmienna przyjmuje wartość 1, wówczas wynikiem jest 0, w przeciwnym razie wynikiem będzie 0.

Napiszmy prosty program demonstrujący działanie logicznych operatorów bitowych.

#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();
}

Wyjście:

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

Operatorzy przesunięcia bitowego

Operatorzy przesunięcia bitowego służą do przesuwania/przesuwania wzorców bitowych w lewo lub w prawo. Lewy i prawy to dwa operatory przesunięcia dostarczane przez 'C', które są reprezentowane w następujący sposób:

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

Tutaj,

  • operand jest wyrażeniem całkowitym, na którym należy wykonać operację przesunięcia.
  • 'n' to całkowita liczba pozycji bitowych, o które należy przesunąć wyrażenie całkowite.

Operacja przesunięcia w lewo przesunie liczbę 'n' bitów na lewą stronę. Najbardziej lewe bity w wyrażeniu zostaną wyrzucone, a n bitów o wartości 0 zostanie wypełnionych po prawej stronie.

Operacja przesunięcia w prawo przesunie liczbę 'n' bitów na prawą stronę. Najbardziej wysunięte na prawo 'n' bity w wyrażeniu zostaną wyskoczone, a wartość 0 zostanie wypełniona po lewej stronie.

Przykład: x jest wyrażeniem całkowitym o danych 1111. Po wykonaniu operacji przesunięcia wynik będzie następujący:

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

ShiftOperatory s mogą być łączone, a następnie mogą być używane do wyodrębniania danych z wyrażenia całkowitego. Napiszmy program, aby zademonstrować użycie operatorów przesunięcia bitowego.

#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;
}

Wyjście:

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

Po wykonaniu operacji przesunięcia w lewo wartość będzie wynosić 80, co w systemie binarnym odpowiada liczbie 101000.

Po wykonaniu operacji przesunięcia w prawo wartość przyjmie wartość 5, co w systemie binarnym odpowiada liczbie 000101.

Operator uzupełnienia bitowego

Uzupełnienie bitowe nazywane jest również operatorem uzupełnienia jedności, ponieważ zawsze przyjmuje tylko jedną wartość lub operand. Jest to operator jednoargumentowy.

Kiedy wykonujemy uzupełnienie na dowolnych bitach, wszystkie jedynki stają się zerami i odwrotnie.

Jeżeli mamy wyrażenie całkowite zawierające 0000 1111, to po wykonaniu operacji uzupełnienia bitowego wartość będzie wynosić 1111 0000.

Operator uzupełnienia bitowego oznaczany jest symbolem tyldy (~).

Napiszmy program, który demonstruje implementację operatora uzupełnienia bitowego.

#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;
}

Wyjście:

Complement - Value of c is -11

Oto inny program, zawierający przykład wszystkich dotychczas omówionych operacji:

#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 );}

Po skompilowaniu i uruchomieniu programu otrzymujemy następujący wynik:

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

Podsumowanie

  • Operatorzy bitowi to specjalny zestaw operatorów udostępniony przez język 'C.'
  • Są używane w programowaniu na poziomie bitowym.
  • Operatorzy ci służą do manipulowania bitami wyrażenia całkowitego.
  • Operatory logiczne, przesunięcia i uzupełnienia to trzy typy operatorów bitowych.
  • Operator uzupełnienia bitowego służy do odwrócenia kolejności bitów wyrażenia.