What is a byte & how does it work?

Bitwise Operatorer i C: En Komplet Guide

11/09/2017

Rating: 4.83 (13961 votes)

I en verden af programmering, især i sprog som C, er evnen til at manipulere data på det mest grundlæggende niveau afgørende for ydeevne og effektivitet. Mens de fleste operationer arbejder med bytes, den mindste adresserbare dataenhed, giver C-sproget os et kraftfuldt værktøjssæt til at arbejde direkte med de individuelle bits, der udgør disse bytes. Disse værktøjer er kendt som bitwise operatorer. De tillader programmører at udføre operationer, der er utroligt hurtige, da de svarer direkte til computerens hardwareinstruktioner. At mestre disse operatorer åbner op for en ny dimension af kodningsoptimering og kontrol, som er essentiel i systemnær programmering, indlejrede systemer og højtydende applikationer.

What is a bitwise operation?
In computer programming, a bitwise operation operates on a bit string, a bit array or a binary numeral (considered as a bit string) at the level of its individual bits. It is a fast and simple action, basic to the higher-level arithmetic operations and directly supported by the processor.
Indholdsfortegnelse

Hvad er Bitwise Operatorer?

Bitwise operatorer bruges til at udføre operationer på individuelle bits. Det er vigtigt at skelne dem fra logiske operatorer (som `&&` og `||`), der evaluerer udtryk baseret på deres sandheds- eller falskværdi (sandt/falsk) og arbejder på hele bytes eller større datatyper. Bitwise operatorer, derimod, ser på den binære repræsentation af tal og manipulerer hver bit separat. C-sproget er berømt for denne kapabilitet, da det giver enestående kontrol over data helt ned på hardwareniveau. Fordi disse operationer er så tæt på, hvordan processoren fungerer, er de markant hurtigere end mange aritmetiske operationer. Der findes seks primære bitwise operatorer i C, som vi vil udforske i detaljer.

De Seks Bitwise Operatorer i C

C-sproget understøtter følgende seks bitwise operatorer:

  • Bitwise OR ( | )
  • Bitwise AND ( & )
  • Bitwise XOR ( ^ )
  • Bitwise One's Complement ( ~ )
  • Bitwise Left-Shift ( << )
  • Bitwise Right-Shift ( >> )

Lad os gennemgå hver af dem med eksempler for at forstå deres funktion.

Bitwise OR Operator ( | )

Bitwise OR-operatoren er en binær operator, hvilket betyder, at den arbejder på to operander. Den sammenligner hvert par af bits fra de to tal. Hvis mindst én af de to bits er 1, er resultatet for den pågældende bitposition 1. Resultatet er kun 0, hvis begge bits er 0.

Sandhedstabel for Bitwise OR ( | )

Input bit 1 (X)Input bit 2 (Y)Resultat (X | Y)
000
011
101
111

Eksempel på Bitwise OR

Lad os antage, vi har to variable, X = 10 og Y = 20. Den bitvise OR-operation (X | Y) vil give resultatet 30.

X (10) -> 0000 1010 Y (20) -> 0001 0100 --------------------- X|Y (30) -> 0001 1110

Som det ses, for hver bitposition, hvis enten X eller Y har en 1'er, har resultatet også en 1'er.

Bitwise AND Operator ( & )

Ligesom OR er Bitwise AND også en binær operator. Den sammenligner hvert par af bits. Resultatet for en bitposition er kun 1, hvis begge korresponderende bits i de to operander er 1. I alle andre tilfælde er resultatet 0. Det er vigtigt ikke at forveksle den bitvise AND ( `&` ) med den logiske AND ( `&&` ).

Sandhedstabel for Bitwise AND ( & )

Input bit 1 (X)Input bit 2 (Y)Resultat (X & Y)
000
010
100
111

Eksempel på Bitwise AND

Lad os tage to tal, X = 8 og Y = 7. Den bitvise AND-operation (X & Y) vil resultere i 0.

X (8) -> 0000 1000 Y (7) -> 0000 0111 -------------------- X&Y (0) -> 0000 0000

Da der ikke er nogen bitpositioner, hvor både X og Y har en 1'er, bliver hele resultatet 0.

Bitwise One's Complement Operator ( ~ )

Dette er en unær operator, hvilket betyder, at den kun arbejder på én operand. Den inverterer simpelthen alle bits i tallet. Hver 0 bliver til en 1, og hver 1 bliver til en 0. Denne operator er også kendt som NOT-operatoren.

Sandhedstabel for One's Complement ( ~ )

Input bit (X)Resultat (~X)
01
10

Eksempel på One's Complement

Hvis vi tager tallet X = 10, vil den bitvise One's Complement (~X) give -11. Dette kan virke forvirrende, men det skyldes, hvordan computere repræsenterer negative tal ved hjælp af Two's Complement-systemet.

X (10) -> 0000 1010 ~X (-11) -> 1111 0101

En simpel regel for signed integers er, at `~n` er lig med `-(n+1)`. Så for `~10` er resultatet `-(10+1)`, altså -11. Denne operatorer er meget nyttig til at vende bit-masker.

Bitwise Left-Shift Operator ( << )

Left-Shift-operatoren er en binær operator, der flytter bits i den venstre operand et specificeret antal positioner til venstre. De nye positioner til højre fyldes op med nuller.

What are C operators used for?
Operators can be used to perform operation directly on some value (C Literals) or on C variables. In the C language we can perform arithmetic operations, logical and relational operations, bitwise operations, etc. using the C operators on data. Q2. What are the different types of operators C supports?

Syntaks: `variabel << antal_positioner`

Eksempel på Left-Shift

Hvis vi tager X = 10 og flytter det én position til venstre (X << 1), bliver resultatet 20.

X (10) -> 0000 1010 X << 1 (20) -> 0001 0100

Hver gang du venstre-skifter et tal med én position, svarer det til at multiplicere tallet med 2. Generelt gælder det, at `X << n` er det samme som `X * 2^n`. Dette er en meget hurtig måde at multiplicere med potenser af 2 på.

Bitwise Right-Shift Operator ( >> )

Denne operator fungerer modsat af Left-Shift. Den flytter bits i den venstre operand et specificeret antal positioner til højre.

Syntaks: `variabel >> antal_positioner`

Eksempel på Right-Shift

Hvis vi tager X = 20 og flytter det én position til højre (X >> 1), bliver resultatet 10.

X (20) -> 0001 0100 X >> 1 (10) -> 0000 1010

At højre-skifte et tal med én position svarer til at udføre en heltalsdivision med 2. Generelt er `X >> n` det samme som `X / 2^n`. Dette er en ekstremt effektiv måde at dividere med potenser af 2 på.

Bitwise XOR Operator ( ^ )

XOR står for "Exclusive OR". Denne binære operator sammenligner hvert par af bits. Resultatet er 1, hvis de to bits er forskellige (én 0 og én 1). Hvis begge bits er ens (begge 0 eller begge 1), er resultatet 0.

Sandhedstabel for Bitwise XOR ( ^ )

Input bit 1 (X)Input bit 2 (Y)Resultat (X ^ Y)
000
011
101
110

Eksempel på Bitwise XOR

Lad os tage X = 10 og Y = 5. Den bitvise XOR-operation (X ^ Y) giver resultatet 15.

X (10) -> 0000 1010 Y (5) -> 0000 0101 --------------------- X^Y (15) -> 0000 1111

XOR har en interessant egenskab: `(A ^ B) ^ B` giver `A` tilbage. Dette bruges i mange algoritmer, herunder simpel kryptering og til at bytte to variable uden at bruge en midlertidig variabel.

Vigtige Karakteristika og Overvejelser

  • Bit-niveau vs. Byte-niveau: Den største forskel mellem bitwise og logiske operatorer er deres operationsniveau. Bitwise arbejder på individuelle bits, mens logiske arbejder på hele værdier (sandt/falsk).
  • Kun for heltal: Bitwise operatorer kan kun anvendes på heltalstyper (som `int`, `char`, `long`). De kan ikke bruges på flydende kommatal som `float` eller `double`.
  • Høj ydeevne: Som nævnt er disse operationer ekstremt hurtige. At bruge `x << 1` i stedet for `x * 2` kan give en mærkbar effektivitet i ydelseskritiske dele af en applikation.
  • Symbol-forveksling: Vær meget omhyggelig med ikke at forveksle `&` med `&&` og `|` med `||`. En sådan fejl kan føre til logiske fejl, der er svære at finde, da koden stadig vil kompilere.

Ofte Stillede Spørgsmål (FAQ)

Hvad er den primære forskel på bitwise og logiske operatorer?

Den primære forskel er operationsniveauet. Bitwise operatorer (`&`, `|`, `^`) arbejder på den binære repræsentation af tal, bit for bit. Logiske operatorer (`&&`, `||`) arbejder på sandhedsværdien af hele udtryk. For eksempel vil `10 & 7` give `2`, mens `10 && 7` vil give `true` (eller 1), fordi begge tal er forskellige fra nul.

Kan man bruge bitwise operatorer på float- eller double-typer?

Nej, bitwise operatorer er defineret til kun at virke på heltalstyper (integer data types). Forsøger man at bruge dem på flydende kommatal, vil det resultere i en kompileringsfejl. Dette skyldes, at den binære repræsentation af flydende kommatal (ifølge IEEE 754-standarden) er kompleks og ikke egnet til simple bit-manipulationer som AND eller OR.

Hvorfor er bitwise operationer generelt hurtigere?

Bitwise operationer er hurtigere, fordi de oversættes direkte til en enkelt maskininstruktion på processoren (CPU). Aritmetiske operationer som multiplikation eller division kan kræve flere CPU-cyklusser eller mere komplekse kredsløb. At flytte bits er en af de mest fundamentale og hurtige opgaver, en processor kan udføre.

Hvad er en praktisk anvendelse af XOR-operatoren?

En klassisk anvendelse er at bytte værdien af to variable uden at bruge en tredje, midlertidig variabel. Det gøres således: `x = x ^ y; y = x ^ y; x = x ^ y;`. En anden anvendelse er i simple krypteringsalgoritmer, hvor en datastrøm kan XOR'es med en hemmelig nøgle for at kryptere den. At køre XOR-operationen igen med samme nøgle dekrypterer dataene.

Hvis du vil læse andre artikler, der ligner Bitwise Operatorer i C: En Komplet Guide, kan du besøge kategorien Sundhed.

Go up