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: