C Bitovni operatori: I, ILI, XOR, dopunjavanje i pomaci

U ovom ćete tutorijalu s primjerima naučiti svih 6 bitnih operatora u programiranju C.

U aritmetičko-logičkoj jedinici (koja je unutar CPU-a), matematičke operacije poput: zbrajanja, oduzimanja, množenja i dijeljenja rade se na razini bitova. Za izvođenje operacija na razini bita u programiranju na C koriste se bitni operatori.

Operateri Značenje operatora
& Bitno I
| Bitno ILI
^ Bitno XOR
~ Bitni dodatak
<< Pomak ulijevo
>> Pomaknite desno

Bitni I operator &

Izlaz bitnog AND je 1 ako su odgovarajući bitovi dvaju operanda 1. Ako je bilo koji bit operanda 0, rezultat odgovarajućeg bita procjenjuje se na 0.

Pretpostavimo bitni I rad dviju cijelih 12 i 25.

 12 = 00001100 (u binarnom) 25 = 00011001 (u binarnom) Bit rad 12 i 25 00001100 & 00011001 ________ 00001000 = 8 (u decimalnom)

Primjer # 1: Bitni I

 #include int main() ( int a = 12, b = 25; printf("Output = %d", a&b); return 0; ) 

Izlaz

 Izlaz = 8

Bitni ILI operator |

Izlaz bitnog OR-a iznosi 1 ako je barem jedan odgovarajući bit od dva operanda 1. U C programiranju bitni ILI operator označava se s |.

12 = 00001100 (u binarnom) 25 = 00011001 (u binarnom) Bitno ILI rad 12 i 25 00001100 | 00011001 ________ 00011101 = 29 (u decimalu)

Primjer # 2: Bitno ILI

 #include int main() ( int a = 12, b = 25; printf("Output = %d", a|b); return 0; ) 

Izlaz

 Izlaz = 29

Bitno XOR (ekskluzivni ILI) operator ^

Rezultat bitnog XOR operatora je 1 ako su odgovarajući bitovi dvaju operanda suprotni. Označava se sa ^.

 12 = 00001100 (u binarnom) 25 = 00011001 (u binarnom) Bitno XOR rad 12 i 25 00001100 00011001 ________ 00010101 = 21 (u decimalnom)

Primjer # 3: Bitni XOR

 #include int main() ( int a = 12, b = 25; printf("Output = %d", a^b); return 0; )

Izlaz

 Izlaz = 21

Bitni operator komplementa ~

Operator s bitnim pohvalama je unarni operator (radi na samo jednom operandu). Mijenja se 1 na 0 i 0 na 1. Označava se s ~.

 35 = 00100011 (u binarnom) Bitni komplement Rad od 35 ~ 00100011 ________ 11011100 = 220 (u decimalu) 

Uvrnite bitni operator komplementa u C programiranju

Bitni dodatak 35 (~ 35) je -36 umjesto 220, ali zašto?

Za bilo koji cjelobrojni n bitovni dodatak n bit će -(n+1). Da biste to razumjeli, trebali biste imati znanje o komplementu 2.

Dopuna 2

Dopuna dva je operacija nad binarnim brojevima. Komplement broja 2 jednak je komplementu tog broja plus 1. Na primjer:

 Decimalni dodatak Binarne 2 0 00000000 - (11111111 + 1) = -00000000 = -0 (decimalni) 1 00000001 - (11111110 + 1) = -11111111 = -256 (decimalni) 12 00001100 - (11110011 + 1) = -11110100 = -244 (decimalni) 220 11011100 - (00100011 + 1) = -00100100 = -36 (decimalni) Napomena: Preljev se zanemaruje tijekom izračunavanja komplementa 2. 

Bitni dodatak od 35 je 220 (u decimalnom). Dodatak dvojke od 220 je -36. Dakle, izlaz je -36 umjesto 220.

Bitni komplement bilo kojeg broja N je - (N + 1). Evo kako:

 bitni komplement N = ~ N (predstavljen u obliku komplementa 2) 2'komplement ~ N = - (~ (~ N) +1) = - (N + 1) 

Primjer # 4: Bitni komplement

 #include int main() ( printf("Output = %d",~35); printf("Output = %d",~-12); return 0; ) 

Izlaz

 Izlaz = -36 Izlaz = 11

Operatori smjene u programiranju C

Postoje dva operatora smjene u programiranju C:

  • Operator desne smjene
  • Operator lijeve smjene.

Desni mjenjač

Operator desnog pomaka pomiče sve bitove udesno za određeni broj zadanih bitova. Označava se sa >>.

 212 = 11010100 (u binarnom) 212 >> 2 = 00110101 (u binarnom) (desni pomak za dva bita) 212 >> 7 = 00000001 (u binarnom) 212 >> 8 = 00000000 212 >> 0 = 11010100 (bez pomaka) 

Lijevi mjenjač

Operator lijevog pomaka pomiče sve bitove prema lijevo za određeni broj navedenih bitova. Položaji bitova koje je napustio operator lijeve smjene popunjavaju se s 0. Simbol lijevog operatora smjene je <<.

 212 = 11010100 (u binarnom) 212 << 1 = 110101000 (u binarnom) (lijevi pomak za jedan bit) 212 << 0 = 11010100 (pomak za 0) 212 << 4 = 110101000000 (u binarnom) = 3392 (u decimalnom )

Primjer # 5: Operatori smjene

 #include int main() ( int num=212, i; for (i=0; i>i); printf(""); for (i=0; i<=2; ++i) printf("Left shift by %d: %d", i, num< 
 Right Shift by 0: 212 Right Shift by 1: 106 Right Shift by 2: 53 Left Shift by 0: 212 Left Shift by 1: 424 Left Shift by 2: 848 

Zanimljivi članci...