bitvis Operators i C: AND, OR, XOR, Shift & Komplettera
Vad รคr Bitwise Operators?
bitvis Operatorer anvรคnds fรถr att manipulera data pรฅ bitnivรฅ, รคven kallad bitnivรฅprogrammering. Bitwise arbetar pรฅ ett eller flera bitmรถnster eller binรคra siffror pรฅ nivรฅn fรถr deras individuella bitar. De anvรคnds i numeriska berรคkningar fรถr att gรถra berรคkningsprocessen snabbare.
Fรถljande รคr listan รถver bitvisa operatorer som tillhandahรฅlls av programmeringssprรฅket 'C':
| Operator | Betydelse |
|---|---|
| & | Bitvis OCH-operator |
| | | Bitvis ELLER-operator |
| ^ | Bitvis exklusiv ELLER-operatรถr |
| ~ | Binary Ones komplement Operator รคr en unรคr operatรถr |
| << | Vรคnster skiftfรถrare |
| >> | Hรถgervรคxlingsfรถrare |
Bitvisa operatorer kan inte tillรคmpas direkt pรฅ primitiva datatyper som float, double, etc. Kom alltid ihรฅg en sak att bitvisa operatorer oftast anvรคnds med heltalsdatatypen pรฅ grund av dess kompatibilitet.
De bitvisa logiska operatorerna arbetar pรฅ datan bit fรถr bit, med utgรฅngspunkt frรฅn den minst signifikanta biten, dvs LSB-biten som รคr biten lรคngst till hรถger, och arbetar mot MSB (Most Significant Bit) som รคr biten lรคngst till vรคnster.
Resultatet av berรคkningen av bitvisa logiska operatorer visas i tabellen nedan.
| x | y | x & y | x | dรคr | x^y |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
Bitvis OCH
Detta รคr en av de mest anvรคnda logiska bitvisa operatorerna. Det representeras av ett enda et-tecken (&). Tvรฅ heltalsuttryck skrivs pรฅ varje sida av (&)-operatorn.
Resultatet av den bitvisa OCH-operationen รคr 1 om bรฅda bitarna har vรคrdet 1; annars รคr resultatet alltid 0.
Lรฅt oss tรคnka pรฅ att vi har 2 variabler op1 och op2 med vรคrden enligt fรถljande:
Op1 = 0000 1101 Op2 = 0001 1001
Resultatet av OCH-operationen pรฅ variablerna op1 och op2 blir
Result = 0000 1001
Som vi kan se jรคmfรถrs tvรฅ variabler bit fรถr bit. Nรคr vรคrdet pรฅ en bit i bรฅda variablerna รคr 1, blir resultatet 1 eller 0.
Bitvis ELLER
Det representeras av ett enda vertikalt strecktecken (|). Tvรฅ heltalsuttryck skrivs pรฅ var sida om operatorn (|).
Resultatet av den bitvisa ELLER-operationen รคr 1 om รฅtminstone ett av uttrycken har vรคrdet 1; annars รคr resultatet alltid 0.
Lรฅt oss tรคnka pรฅ att vi har 2 variabler op1 och op2 med vรคrden enligt fรถljande:
Op1 = 0000 1101 Op2 = 0001 1001
Resultatet av ELLER-operationen pรฅ variablerna op1 och op2 blir
Result = 0001 1101
Som vi kan se jรคmfรถrs tvรฅ variabler bit fรถr bit. Nรคr vรคrdet pรฅ en bit i en av variablerna รคr 1, blir resultatet 1 eller 0.
Bitwise Exklusiv ELLER
Den representeras av en symbol (^). Tvรฅ heltalsuttryck skrivs pรฅ var sida om operatorn (^).
Resultatet av den bitvisa Exclusive-OR-operationen รคr 1 om bara ett av uttrycken har vรคrdet 1; annars รคr resultatet alltid 0.
Lรฅt oss tรคnka pรฅ att vi har 2 variabler op1 och op2 med vรคrden enligt fรถljande:
Op1 = 0000 1101 Op2 = 0001 1001
Resultatet av XOR-operationen pรฅ variablerna op1 och op2 blir
Result = 0001 0100
Som vi kan se jรคmfรถrs tvรฅ variabler bit fรถr bit. Nรคr bara en variabel har vรคrdet 1 sรฅ รคr resultatet 0 annars blir 0 resultatet.
Lรฅt oss skriva ett enkelt program som visar bitvis logiska operatorer.
#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();
}
Produktion:
AND - Value of c is 20 OR - Value of c is 21 Exclusive-OR - Value of c is 1
Bitvis skiftoperatorer
De bitvisa skiftoperatorerna anvรคnds fรถr att flytta/skifta bitmรถnstren antingen till vรคnster eller hรถger sida. Vรคnster och hรถger รคr tvรฅskiftsoperatรถrer tillhandahรฅllna av 'C' som representeras enligt fรถljande:
Operand << n (Left Shift) Operand >> n (Right Shift)
Hรคr,
- en operand รคr ett heltalsuttryck som vi mรฅste utfรถra skiftoperationen pรฅ.
- 'n' รคr det totala antalet bitpositioner som vi mรฅste skifta i heltalsuttrycket.
Vรคnstervรคxlingsoperationen kommer att flytta 'n' antalet bitar till vรคnster sida. Bitarna lรคngst till vรคnster i uttrycket kommer att poppas ut, och n bitar med vรคrdet 0 kommer att fyllas i pรฅ hรถger sida.
Den hรถgra vรคxlingsoperationen kommer att flytta "n" antalet bitar till hรถger sida. De 'n' bitarna lรคngst till hรถger i uttrycket kommer att visas och vรคrdet 0 kommer att fyllas i pรฅ vรคnster sida.
Exempel: x รคr ett heltalsuttryck med data 1111. Efter att ha utfรถrt skiftoperationen blir resultatet:
x << 2 (left shift) = 1111<<2 = 1100 x>>2 (right shift) = 1111>>2 = 0011
Shifts-operatorer kan kombineras och sedan kan de anvรคndas fรถr att extrahera data frรฅn heltalsuttrycket. Lรฅt oss skriva ett program fรถr att demonstrera anvรคndningen av bitvisa skiftoperatorer.
#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;
}
Produktion:
Left shift - Value of c is 80 Right shift - Value of c is 5
Efter att ha utfรถrt vรคnstervรคxlingsoperationen blir vรคrdet 80 vars binรคra ekvivalent รคr 101000.
Efter att ha utfรถrt rรคtt skiftoperation blir vรคrdet 5 vars binรคra ekvivalent รคr 000101.
Bitvis komplementoperatรถr
Det bitvisa komplementet kallas ocksรฅ som ens komplementoperator eftersom det alltid bara tar ett vรคrde eller en operand. Det รคr en unรคr operatรถr.
Nรคr vi utfรถr komplement pรฅ vilka bitar som helst, blir alla 1:or 0:or och vice versa.
Om vi โโhar ett heltalsuttryck som innehรฅller 0000 1111 blir vรคrdet 1111 0000 efter att ha utfรถrt en bitvis komplementoperation.
Bitvis komplementoperator betecknas med symbolen tilde (~).
Lรฅt oss skriva ett program som visar implementeringen av en bitvis komplementoperator.
#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;
}
Produktion:
Complement - Value of c is -11
Hรคr รคr ett annat program, med ett exempel pรฅ alla operater som diskuterats hittills:
#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 );}
Nรคr vi har kompilerat och kรถrt programmet ger det fรถljande resultat:
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
Sammanfattning
- Bitvisa operatorer รคr speciella operatoruppsรคttningar som tillhandahรฅlls av 'C.'
- De anvรคnds i bitnivรฅprogrammering.
- Dessa operatorer anvรคnds fรถr att manipulera bitar av ett heltalsuttryck.
- Logisk, skift och komplement รคr tre typer av bitvisa operatorer.
- Bitvis komplementoperator anvรคnds fรถr att vรคnda om bitarna i ett uttryck.
