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.

  • ๐Ÿงฎ Operatorovi: ล est operatora โ€” I (&), ILI (|), XOR (^), komplement (~), pomak ulijevo (<<), pomak udesno (>>) โ€” djeluju bit po bit.
  • ๐Ÿ”— I & ILI: Rezultat & je 1 samo kada su oba bita 1; | je 1 kada je bilo koji bit 1.
  • ๐Ÿ”€ XOR: Rezultat znaka ^ je 1 kada je toฤno jedan bit jednak 1, ลกto je korisno za prebacivanje bitova i zamjenu.ping vrijednosti.
  • โ†”๏ธ Shifts: Operatori << i >> pomiฤu bitove lijevo ili desno, mnoลพeฤ‡i ili dijeleฤ‡i potencijama dva.
  • ๐Ÿ” Upotpuniti, dopuna: Operator ~ okreฤ‡e svaki bit, pa 0000 1111 postaje 1111 0000.
  • ๐Ÿค– Pomoฤ‡ umjetne inteligencije: AI asistenti i GitHub Copilot brzo generiraju i objaลกnjavaju bitmask i logiku pomicanja.

Bitno Operatori u C-u

ล 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

Pitanja i odgovori

Bitovni I (&) operira na pojedinaฤnim bitovima i vraฤ‡a cijeli broj, dok logiฤki I (&&) provjerava cijele izraze i vraฤ‡a jednu logiฤku vrijednost "true" ili "false".

Shift 1 za izradu maske: postavite s vrijednoลกฤ‡u | (1 << n), obriลกite s vrijednoลกฤ‡u & ~(1 << n) i preklopite s vrijednoลกฤ‡u ^ (1 << n).

Lijevi pomak za n mnoลพi neoznaฤenu vrijednost s 2 podignutu na n; desni pomak dijeli s njim, pa kompajleri koriste pomake radi brzine.

Provjeri broj i 1. Najniลพi bit vraฤ‡a 1 za neparne vrijednosti i 0 za parne vrijednosti, brลพe od operatora modula.

Ugraฤ‘eni firmware, upravljaฤki programi, kriptografija, kompresija, grafika i umreลพavanje koriste ih za pakiranje zastavica, ฤitanje hardverskih registara, izgradnju maski dozvola i ubrzavanje aritmetike.

Shift Operatori se veลพu ฤvrลกฤ‡e od relacijskih, dok se &, ^ i | nalaze ispod jednakosti, ali iznad logiฤkih && i ||, pa ih stavite u zagrade radi sigurnosti.

Da. Pomoฤ‡nik za kodiranje s umjetnom inteligencijom piลกe maske i pomake iz prompta, objaลกnjava negativne komplemente i pretvara binarne primjere u funkcionalni C. Uvijek testirajte rezultat.

GitHub kopilot predlaลพe makroe za bitmaskiranje, pomoฤ‡ne funkcije za postavljanje i brisanje bitova te matematiฤke funkcije za pomicanje iz komentara; pregledajte njegova dovrลกavanja u odnosu na vaลก raspored bitova.

Saลพmite ovu objavu uz: