bitenkénti Operatorok C-ben: ÉS, VAGY, XOR, Shift & Kiegészítés

Mik azok a Bitwise Operators?

bitenkénti Operatorzok Az adatok bitszintű manipulálására szolgálnak, más néven bitszintű programozásnak. A bitenkénti egy vagy több bitmintával vagy bináris számmal működik az egyes bitek szintjén. Numerikus számításokhoz használják a számítási folyamat felgyorsítása érdekében.

Az alábbiakban a 'C' programozási nyelv által biztosított bitenkénti operátorok listája található:

Operator Jelentés
& Bitenkénti ÉS operátor
| Bitenkénti VAGY operátor
^ Bitenkénti kizárólagos VAGY operátor
~ A bináris egyes komplementere OperaA tor egy unáris operátor
<< Bal váltókezelő
>> Jobb váltókezelő

A bitenkénti operátorokat nem lehet közvetlenül alkalmazni olyan primitív adattípusokra, mint a float, double stb. Mindig ne feledjen egy dolgot, hogy a bitenkénti operátorokat többnyire az egész adattípussal együtt használják, annak kompatibilitása miatt.

A bitenkénti logikai operátorok bitenként dolgoznak az adatokon, kezdve a legkisebb jelentőségű bittől, azaz az LSB bittől, amely a jobb szélső bit, és az MSB (Most Significant Bit) felé haladva, amely a bal szélső bit.

A bitenkénti logikai operátorok számításának eredményét az alábbi táblázat mutatja.

x y x & y x | és x^y
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0

Bitálisan ÉS

Ez az egyik leggyakrabban használt logikai bitenkénti operátor. Ezt egyetlen „és” jel (&) jelöli. Két egész kifejezést írunk az (&) operátor mindkét oldalára.
A bitenkénti ÉS művelet eredménye 1, ha mindkét bit értéke 1; egyébként az eredmény mindig 0.

Tekintsük, hogy van 2 op1 és op2 változónk a következő értékekkel:

Op1 = 0000 1101
Op2 = 0001 1001

Az AND művelet eredménye az op1 és op2 változókon lesz

Result = 0000 1001

Amint látjuk, két változót bitenként hasonlítanak össze. Ha a bit értéke mindkét változóban 1, akkor az eredmény 1 vagy 0 lesz.

Bitenként VAGY

Egyetlen függőleges oszlopjel (|) ábrázolja. Két egész kifejezést írunk a (|) operátor mindkét oldalára.

A bitenkénti VAGY művelet eredménye 1, ha legalább az egyik kifejezés értéke 1; egyébként az eredmény mindig 0.

Tekintsük, hogy van 2 op1 és op2 változónk a következő értékekkel:

Op1 = 0000 1101
Op2 = 0001 1001

Az op1 és op2 változókra vonatkozó VAGY művelet eredménye a következő lesz

Result = 0001 1101

Amint látjuk, két változót bitenként hasonlítanak össze. Ha az egyik változóban egy bit értéke 1, akkor az eredmény 1 vagy 0 lesz.

Bitenkénti exkluzív VAGY

Egy szimbólum (^) jelöli. Két egész kifejezést írunk a (^) operátor mindkét oldalára.

A bitenkénti Exclusive-OR művelet eredménye 1, ha csak az egyik kifejezés értéke 1; egyébként az eredmény mindig 0.

Tekintsük, hogy van 2 op1 és op2 változónk a következő értékekkel:

Op1 = 0000 1101
Op2 = 0001 1001

Az XOR művelet eredménye az op1 és op2 változókon lesz

Result = 0001 0100

Amint látjuk, két változót bitenként hasonlítanak össze. Ha csak egy változóban van 1, akkor az eredmény 0, különben 0 lesz az eredmény.

Írjunk egy egyszerű programot, amely bitenkénti logikai operátorokat mutat be.

#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();
}

output:

AND - Value of c is 20
OR - Value of c is 21
Exclusive-OR - Value of c is 1

Bitenkénti eltolási operátorok

A bitenkénti eltolási operátorok a bitminták balra vagy jobbra történő mozgatására/eltolására szolgálnak. A bal és a jobb oldal két műszak operátort biztosít a 'C", amelyek a következőképpen vannak ábrázolva:

Operand << n (Left Shift)
Operand >> n (Right Shift)

Itt,

  • az operandus egy egész kifejezés, amelyen el kell végeznünk a shift műveletet.
  • Az 'n' azoknak a bithelyeknek a száma, amelyeket el kell tolnunk az egész kifejezésben.

A bal oldali eltolás művelet az 'n' számú bitet a bal oldalra tolja. A kifejezés bal szélső bitjei kiugrik, és n bit 0 értékű a jobb oldalon.

A jobb oldali eltolás művelet az 'n' számú bitet a jobb oldalra tolja. A kifejezés jobb szélső 'n' bitjei kiugrik, és a 0 érték a bal oldalon lesz kitöltve.

Példa: x egy egész kifejezés 1111 adattal. A shift művelet végrehajtása után az eredmény a következő lesz:

x << 2 (left shift) = 1111<<2 = 1100
x>>2 (right shift) = 1111>>2 = 0011

Shifts operátorok kombinálhatók, akkor az adatok kinyerésére használhatók az egész kifejezésből. Írjunk egy programot a bitenkénti eltolási operátorok használatának bemutatására.

#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;
}

output:

Left shift - Value of c is 80
Right shift - Value of c is 5

A balra eltolás művelet végrehajtása után az érték 80 lesz, melynek bináris megfelelője 101000.

A jobb eltolási művelet végrehajtása után az érték 5 lesz, amelynek bináris megfelelője 000101.

Bitenkénti komplement operátor

A bitenkénti kiegészítést komplement operátornak is nevezik, mivel mindig csak egy értéket vagy egy operandust vesz fel. Ez egy unáris operátor.

Ha bármely biten komplementet hajtunk végre, az 1-esek 0-vá válnak, és fordítva.

Ha van egy egész kifejezésünk, amely 0000 1111-et tartalmaz, akkor bitenkénti komplementművelet végrehajtása után az érték 1111 0000 lesz.

A bitenkénti komplement operátort tilde (~) szimbólum jelöli.

Írjunk egy programot, amely bemutatja a bitenkénti komplement operátor megvalósítását.

#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;
}

output:

Complement - Value of c is -11

Íme egy másik program, egy példával az összes eddig tárgyalt operációra:

#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 );}

A program összeállítása és futtatása után a következő eredményt adja:

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

Összegzésként

  • A bitenkénti operátorok a 'C' által biztosított speciális operátorkészletek.
  • Bitszintű programozásban használatosak.
  • Ezeket az operátorokat egy egész kifejezés bitjeinek manipulálására használják.
  • A logikai, a shift és a komplementer háromféle bitenkénti operátor.
  • A bitenkénti komplement operátor a kifejezés bitjeinek megfordítására szolgál.

Napi Guru99 hírlevél

Kezdje a napját a legfrissebb és legfontosabb mesterséges intelligenciával kapcsolatos hírekkel, amelyeket azonnal kézbesítünk.