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.

  • ๐Ÿงฎ Operatory: Szeล›ฤ‡ operatorรณw โ€” AND (&), OR (|), XOR (^), uzupeล‚nienie (~), przesuniฤ™cie w lewo (<<), przesuniฤ™cie w prawo (>>) โ€” dziaล‚a stopniowo.
  • ๐Ÿ”— I & LUB: Wynik & jest rรณwny 1 tylko wtedy, gdy oba bity majฤ… wartoล›ฤ‡ 1; | jest rรณwny 1, gdy ktรณrykolwiek bit ma wartoล›ฤ‡ 1.
  • ๐Ÿ”€ XOR: Wynik ^ wynosi 1, gdy dokล‚adnie jeden bit ma wartoล›ฤ‡ 1, co jest przydatne przy przeล‚ฤ…czaniu bitรณw i zamianieping wartoล›ci.
  • โ†”๏ธ Shifts: Operatory << i >> przesuwajฤ… bity w lewo lub w prawo, mnoลผฤ…c lub dzielฤ…c przez potฤ™gi liczby dwa.
  • ๐Ÿ” Komplement: Operator ~ odwraca kaลผdy bit, wiฤ™c 0000 1111 staje siฤ™ 1111 0000.
  • ๐Ÿค– Pomoc AI: Asystenci AI i GitHub Copilot szybko generujฤ… i wyjaล›niajฤ… logikฤ™ masek bitowych i przesuniฤ™ฤ‡.

Bitowy Operatory w C

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

FAQ

Operacja bitowa AND (&) dziaล‚a na pojedynczych bitach i zwraca liczbฤ™ caล‚kowitฤ…, podczas gdy operacja logiczna AND (&&) sprawdza caล‚e wyraลผenia i zwraca pojedynczฤ… wartoล›ฤ‡ logicznฤ… true lub false.

Shift 1, aby utworzyฤ‡ maskฤ™: ustaw za pomocฤ… wartoล›ci | (1 << n), wyczyล›ฤ‡ za pomocฤ… wartoล›ci & ~(1 << n) i przeล‚ฤ…cz za pomocฤ… wartoล›ci ^ (1 << n).

Przesuniฤ™cie w lewo o n mnoลผy wartoล›ฤ‡ bez znaku przez 2 podniesione do n; przesuniฤ™cie w prawo dzieli przez n, dlatego kompilatory uลผywajฤ… przesuniฤ™ฤ‡ w celu przyspieszenia dziaล‚ania.

Sprawdลบ liczbฤ™ & 1. Najniลผszy bit zwraca 1 dla wartoล›ci nieparzystych i 0 dla wartoล›ci parzystych, szybciej niลผ operator modulo.

Wbudowane oprogramowanie sprzฤ™towe, sterowniki, kryptografia, kompresja, grafika i sieci wykorzystujฤ… je do pakowania flag, odczytywania rejestrรณw sprzฤ™towych, tworzenia masek uprawnieล„ i przyspieszania obliczeล„ arytmetycznych.

Shift operatory wiฤ…ลผฤ… siฤ™ ล›ciล›lej niลผ operatory relacyjne, podczas gdy &, ^ i | znajdujฤ… siฤ™ poniลผej operatorรณw rรณwnoล›ci, ale powyลผej logicznych && i ||, dlatego dla bezpieczeล„stwa naleลผy je umieล›ciฤ‡ w nawiasach.

Tak. Asystent kodowania AI tworzy maski i przeล‚ฤ…cza siฤ™ miฤ™dzy poleceniami, wyjaล›nia dopeล‚nienia negatywne i zamienia przykล‚ady binarne na dziaล‚ajฤ…ce C. Zawsze testuj wynik.

Drugi pilot GitHub sugeruje makra maski bitowej, pomocniki ustawiania i czyszczenia bitรณw oraz przenoszenie obliczeล„ matematycznych z komentarza; sprawdลบ jego uzupeล‚nienia w odniesieniu do ukล‚adu bitรณw.

Podsumuj ten post nastฤ™pujฤ…co: