Bitowy Operatory w C: AND, OR, XOR, Shift & Komplement
โก Inteligentne podsumowanie
Operatorzy bitowi w jฤzyku C manipulujฤ danymi na poziomie pojedynczych bitรณw, wykorzystujฤ c operacje AND, OR, XOR, uzupeลnienia i przesuniฤcia na operandach caลkowitych, co pozwala na szybsze wykonywanie obliczeล, pakowanie flag i sterowanie sprzฤtem w programowaniu niskiego poziomu i wbudowanym.

Czym sฤ bitowe Operatory?
Bitowy OperaTorsy sลuลผฤ do manipulowania danymi na poziomie bitowym, co nazywa siฤ rรณwnieลผ programowaniem na poziomie bitowym. Programowanie bitowe operuje na jednym lub kilku wzorcach bitowych lub liczbach binarnych na poziomie poszczegรณlnych bitรณw. Sฤ one wykorzystywane 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 pamiฤtaj o jednej rzeczy: operatorรณw bitowych uลผywa siฤ gลรณwnie z typ danych caลkowitych ze wzglฤdu na swojฤ kompatybilnoลฤ.
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
Operatory przesuniฤcia bitowego sลuลผฤ do przesuwania wzorcรณw bitowych w lewo lub w prawo. Lewy i prawy to dwa operatory przesuniฤcia dostฤpne w jฤzyku 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 moลผna ลฤ czyฤ, a nastฤpnie moลผna ich uลผywaฤ do np.tract dane z wyraลผenia caลkowitego. Napiszmy program demonstrujฤ cy 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 kolejny program zawierajฤ cy przykลad wszystkich dotychczas omรณwionych operatorรณw:
#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
