bitvis Operators i C: AND, OR, XOR, Shift & Komplettera

โšก Smart sammanfattning

Bitvisa operatorer i C manipulerar data pรฅ individuell bitnivรฅ med hjรคlp av AND-, OR-, XOR-, komplement- och shift-operationer pรฅ heltalsoperander fรถr att utfรถra snabbare berรคkningar, packa flaggor och styra hรฅrdvara i lรฅgnivรฅ- och inbรคddad programmering.

  • ๐Ÿงฎ Operators: Sex operatorer โ€” AND (&), OR (|), XOR (^), komplement (~), vรคnsterfรถrskjutning (<<), hรถgerfรถrskjutning (>>) โ€” agerar bit fรถr bit.
  • ๐Ÿ”— OCH & ELLER: &-resultatet รคr 1 endast nรคr bรฅda bitarna รคr 1; | รคr 1 nรคr endera biten รคr 1.
  • ๐Ÿ”€ XOR: Resultatet ^ รคr 1 nรคr exakt en bit รคr 1, praktiskt fรถr att vรคxla bitar och bytaping vรคrden.
  • โ†”๏ธ Shifts: Operatorerna << och >> skjuter bitarna รฅt vรคnster eller hรถger och multiplicerar eller dividerar med tvรฅpotenser.
  • ๐Ÿ” Komplement: Operatorn ~ vรคnder varje bit, sรฅ 0000 1111 blir 1111 0000.
  • ๐Ÿค– AI-hjรคlp: AI-assistenter och GitHub Copilot genererar och fรถrklarar bitmask- och shift-logik snabbt.

bitvis Operatorer i C

Vad รคr Bitwise Operators?

bitvis OperaTorer anvรคnds fรถr att manipulera data pรฅ bitnivรฅ, รคven kallad bitnivรฅprogrammering. Bitvis arbetar med 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 flyttal, dubbel etc. Kom alltid ihรฅg en sak, bitvisa operatorer anvรคnds oftast med heltalsdatatyp 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

Bitvisa skiftoperatorer anvรคnds fรถr att flytta/skifta bitmรถnstren antingen รฅt vรคnster eller hรถger. Vรคnster och hรถger รคr tvรฅ skiftoperatorer som tillhandahรฅlls av 'C' och 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 anvรคndas fรถr att t.ex.tract data frรฅn heltalsuttrycket. Lรฅt oss skriva ett program som demonstrerar 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 operatorer 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

Vanliga frรฅgor

Bitvis AND (&) arbetar pรฅ enskilda bitar och returnerar ett heltal, medan logiskt AND (&&) testar hela uttryck och returnerar ett enda sant eller falskt booleskt vรคrde.

Shift 1 fรถr att skapa en mask: sรคtt med vรคrde | (1 << n), rensa med vรคrde & ~(1 << n), och vรคxla med vรคrde ^ (1 << n).

En vรคnsterfรถrskjutning med n multiplicerar ett oteckenfรถrt vรคrde med 2 upphรถjt till n; en hรถgerfรถrskjutning dividerar med det, sรฅ kompilatorer anvรคnder fรถrskjutningar fรถr hastighet.

Kontrollera siffran & 1. Den lรคgsta biten returnerar 1 fรถr udda vรคrden och 0 fรถr jรคmna vรคrden, snabbare รคn modulusoperatorn.

Inbรคddad firmware, drivrutiner, kryptografi, komprimering, grafik och nรคtverk anvรคnder dem fรถr att packa flaggor, lรคsa hรฅrdvaruregister, bygga behรถrighetsmasker och pรฅskynda aritmetiken.

Shift Operatorerna binder hรฅrdare รคn relationella, medan &, ^ och | sitter under likhet men ovanfรถr logiska && och ||, sรฅ sรคtt i parenteser fรถr sรคkerhets skull.

Ja. En AI-kodningsassistent skriver masker och vรคxlar frรฅn en prompt, fรถrklarar negativa komplement och omvandlar binรคra exempel till fungerande C. Testa alltid resultatet.

GitHub Copilot fรถreslรฅr bitmaskmakron, hjรคlpfunktioner fรถr att sรคtta och rensa bitar, och flytta matematik frรฅn en kommentar; granska dess kompletteringar mot din bitlayout.

Sammanfatta detta inlรคgg med: