Bitno Operatorovi u C: I, ILI, XOR, Shift & Upotpuniti, dopuna
โก Pametni saลพetak
Bitovni operatori u C-u manipuliraju podacima na razini pojedinaฤnog bita, koristeฤi AND, OR, XOR, operacije komplementa i pomicanja na cjelobrojnim operandima kako bi brลพe izvodili izraฤune, pakirali zastavice i kontrolirali hardver u programiranju niske razine i ugraฤenim programima.

ล to su Bitwise Operatorovi?
Bitno OperaProgrami se koriste za manipuliranje podacima na razini bitova, ลกto se naziva i programiranje na razini bitova. Bitno programiranje operira s jednim ili viลกe uzoraka bitova ili binarnih brojeva na razini njihovih pojedinaฤnih bitova. Koriste se u numeriฤkim izraฤunima kako bi se ubrzao proces izraฤuna.
Slijedi popis bitovnih operatora koje nudi programski jezik 'C':
| Operahumka | Znaฤenje |
|---|---|
| & | Operator AND po bitovima |
| | | Operator ILI po bitovima |
| ^ | Ekskluzivni operator OR po bitovima |
| ~ | Binarni jedan komplement Operator je unarni operator |
| << | Operater lijevog pomaka |
| >> | Operator desnog pomaka |
Bitovni operatori ne mogu se izravno primijeniti na primitivne tipove podataka kao ลกto su float, double itd. Uvijek imajte na umu da se bitovni operatori uglavnom koriste s cijeli broj podataka zbog svoje kompatibilnosti.
Bitovi logiฤki operatori rade na podacima bit po bit, poฤevลกi od najmanjeg bita, tj. LSB bita koji je krajnji desni bit, radeฤi prema MSB (Most Significant Bit) koji je krajnji lijevi bit.
Rezultat izraฤuna bitovnih logiฤkih operatora prikazan je u donjoj tablici.
| x | y | x & y | x | tamo | x^y |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
Bitwise I
Ovo je jedan od najฤeลกฤe koriลกtenih logiฤkih bitovnih operatora. Predstavlja se jednim znakom ampersand (&). Sa svake strane operatora (&) napisana su dva cjelobrojna izraza.
Rezultat operacije AND po bitovima je 1 ako oba bita imaju vrijednost kao 1; inaฤe je rezultat uvijek 0.
Uzmimo da imamo 2 varijable op1 i op2 sa sljedeฤim vrijednostima:
Op1 = 0000 1101 Op2 = 0001 1001
Rezultat operacije AND na varijablama op1 i op2 bit ฤe
Result = 0000 1001
Kao ลกto vidimo, dvije varijable se usporeฤuju malo po malo. Kad god je vrijednost bita u obje varijable 1, rezultat ฤe biti 1 ili 0.
Bitno ILI
Predstavljena je jednom okomitom crtom (|). Sa svake strane operatora (|) zapisana su dva cjelobrojna izraza.
Rezultat operacije ILI po bitovima je 1 ako barem jedan od izraza ima vrijednost 1; inaฤe je rezultat uvijek 0.
Uzmimo da imamo 2 varijable op1 i op2 sa sljedeฤim vrijednostima:
Op1 = 0000 1101 Op2 = 0001 1001
Rezultat operacije OR na varijablama op1 i op2 bit ฤe
Result = 0001 1101
Kao ลกto vidimo, dvije varijable se usporeฤuju malo po malo. Kad god je vrijednost bita u jednoj od varijabli 1, rezultat ฤe biti 1 ili 0.
Iskljuฤivo OR po bitovima
Predstavlja se simbolom (^). Sa svake strane operatora (^) napisana su dva cjelobrojna izraza.
Rezultat bitovne operacije Iskljuฤivo ILI je 1 ako samo jedan od izraza ima vrijednost 1; inaฤe je rezultat uvijek 0.
Uzmimo da imamo 2 varijable op1 i op2 sa sljedeฤim vrijednostima:
Op1 = 0000 1101 Op2 = 0001 1001
Rezultat operacije XOR na varijablama op1 i op2 bit ฤe
Result = 0001 0100
Kao ลกto vidimo, dvije varijable se usporeฤuju malo po malo. Kad god samo jedna varijabla ima vrijednost 1 tada je rezultat 0 inaฤe ฤe 0 biti rezultat.
Napiลกimo jednostavan program koji demonstrira bitne logiฤke operatore.
#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(); }
Izlaz:
AND - Value of c is 20 OR - Value of c is 21 Exclusive-OR - Value of c is 1
Operatori pomaka po bitovima
Operatori pomicanja po bitovima koriste se za pomicanje/pomicanje uzoraka bitova ulijevo ili udesno. Lijevo i desno su dva operatora pomicanja koja pruลพa 'C' i predstavljena su na sljedeฤi naฤin:
Operand << n (Left Shift) Operand >> n (Right Shift)
Ovdje,
- operand je cjelobrojni izraz na kojem moramo izvesti operaciju pomaka.
- 'n' je ukupan broj bitnih pozicija koje moramo pomaknuti u cjelobrojnom izrazu.
Operacija pomaka ulijevo ฤe pomaknuti 'n' broj bitova na lijevu stranu. Krajnji lijevi bitovi u izrazu ฤe iskoฤiti, a n bitova s โโvrijednoลกฤu 0 bit ฤe popunjeno na desnoj strani.
Operacija desnog pomaka pomaknut ฤe 'n' broj bitova na desnu stranu. Krajnji desni 'n' bitova u izrazu ฤe iskoฤiti, a vrijednost 0 bit ฤe ispunjena na lijevoj strani.
Primjer: x je cjelobrojni izraz s podacima 1111. Nakon izvoฤenja operacije pomaka rezultat ฤe biti:
x << 2 (left shift) = 1111<<2 = 1100 x>>2 (right shift) = 1111>>2 = 0011
ShiftAko se operatori mogu kombinirati, onda se mogu koristiti za extracpodatke iz cjelobrojnog izraza. Napiลกimo program za demonstraciju upotrebe operatora pomaka po bitovima.
#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; }
Izlaz:
Left shift - Value of c is 80 Right shift - Value of c is 5
Nakon izvoฤenja operacije lijevog pomaka vrijednost ฤe postati 80 ฤiji je binarni ekvivalent 101000.
Nakon izvoฤenja operacije desnog pomaka, vrijednost ฤe postati 5 ฤiji je binarni ekvivalent 000101.
Operator bitne komplementacije
Bitni komplement se takoฤer naziva i neฤijim komplementnim operatorom buduฤi da uvijek uzima samo jednu vrijednost ili operand. To je unarni operator.
Kada izvrลกimo komplement na bilo kojem bitu, sve 1 postaju 0 i obrnuto.
Ako imamo cjelobrojni izraz koji sadrลพi 0000 1111 tada ฤe nakon izvoฤenja operacije komplementiranja po bitovima vrijednost postati 1111 0000.
Operator bitnog komplementa oznaฤava se simbolom tilda (~).
Napiลกimo program koji demonstrira implementaciju operatora bit-komplementa.
#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; }
Izlaz:
Complement - Value of c is -11
Evo joลก jednog programa, s primjerom svih do sada raspravljenih operatora:
#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 );}
Nakon ลกto prevedemo i pokrenemo program, on proizvodi sljedeฤi rezultat:
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
