What is a bitwise & operator?

Forstå Bitvise Operatorer i JavaScript

05/09/2002

Rating: 4.68 (9370 votes)

I JavaScripts verden, hvor vi ofte arbejder med højniveauabstraktioner, er det let at glemme de fundamentale operationer, der foregår under motorhjelmen. Bitvise operatorer giver os en unik mulighed for at dykke ned på det binære niveau og manipulere de enkelte bits, der udgør tal. Selvom de kan virke kryptiske ved første øjekast, er de utroligt kraftfulde værktøjer til optimering, datamanipulation og løsning af specifikke programmeringsudfordringer. Denne artikel vil guide dig igennem alt, hvad du behøver at vide for at forstå og anvende disse fascinerende operatorer i din egen kode.

What is a bitwise operation in JavaScript?
Before a bitwise operation is performed, JavaScript converts numbers to 32 bits signed integers. After the bitwise operation is performed, the result is converted back to 64 bits JavaScript numbers. The examples above uses 4 bits unsigned binary numbers. Because of this ~ 5 returns 10.
Indholdsfortegnelse

Hvad er Bitvise Operatorer?

Bitvise operatorer er specialiserede operatorer, der ikke arbejder med tal som helhed, men derimod med deres individuelle binære cifre (bits). De behandler deres operander som en sekvens af 32 bits (nuller og ettaller) i stedet for som decimal-, hexadecimal- eller oktaltal. For eksempel vil decimaltallet 9 blive repræsenteret som en 32-bit binær sekvens: 00000000000000000000000000001001.

En vigtig detalje i JavaScript er, hvordan tal håndteres. JavaScript gemmer internt alle tal som 64-bit flydende kommatal (floating-point numbers) i henhold til IEEE 754-standarden. Før en bitwise operation udføres, konverterer JavaScript midlertidigt tallet til et 32-bit signeret heltal. Efter operationen er fuldført, konverteres resultatet tilbage til et 64-bit flydende kommatal. Denne konverteringsproces er afgørende at forstå, da den kan have indflydelse på, hvordan operationerne opfører sig, især med meget store tal eller decimaltal.

Der findes syv primære bitvise operatorer i JavaScript:

  • Bitwise AND (&)
  • Bitwise OR (|)
  • Bitwise XOR (^)
  • Bitwise NOT (~)
  • Left Shift (<<)
  • Sign-propagating Right Shift (>>)
  • Zero-fill Right Shift (>>>)

De Logiske Operatorer: AND, OR & XOR

Disse tre operatorer sammenligner to tal bit for bit og producerer et nyt tal baseret på logiske regler. De er kernen i mange bitvise manipulationer.

Bitwise AND (&)

Bitwise AND-operatoren (&) sammenligner hvert par af tilsvarende bits fra to tal. Den returnerer kun en 1 i resultatets bitposition, hvis begge de sammenlignede bits er 1. Ellers returnerer den 0. Dette er nyttigt til at "maskere" bits, dvs. at tjekke om en bestemt bit er sat, eller til at fjerne bestemte bits.

Lad os se på et eksempel med tallene 12 og 25:

  • 12 i binær form er 00001100
  • 25 i binær form er 00011001
 00001100 (12) & 00011001 (25) ------------------ 00001000 (8)

Resultatet er 8, fordi kun den fjerde bit fra højre (med en værdi af 8) er 1 i begge tal.

Bitwise OR (|)

Bitwise OR-operatoren (|) sammenligner også hvert par af bits. Den returnerer en 1 i resultatets bitposition, hvis mindst én af de sammenlignede bits er 1. Den returnerer kun 0, hvis begge bits er 0. Dette bruges ofte til at sætte (aktivere) en eller flere specifikke bits.

Med de samme tal, 12 og 25:

 00001100 (12) | 00011001 (25) ------------------ 00011101 (29)

Resultatet er 29, fordi for hver position, hvor mindst ét af tallene har en 1, bliver resultatets bit også 1.

Bitwise XOR (^)

Bitwise XOR (Exclusive OR) operatoren (^) returnerer en 1, hvis de to sammenlignede bits er forskellige. Hvis begge bits er ens (begge 0 eller begge 1), returnerer den 0. Denne operator er nyttig til at "flippe" eller skifte status på specifikke bits.

Igen med 12 og 25:

 00001100 (12) ^ 00011001 (25) ------------------ 00010101 (21)

Resultatet er 21. Bemærk, hvordan de positioner, hvor bitsene var ens (f.eks. den tredje bit fra højre), resulterer i en 0.

Does ECMAScript return true if both a and B are true?
The official ECMAScript documentation can be found here Worth noting that || will also return true if BOTH A and B are true. In JavaScript, if you're looking for A or B, but not both, you'll need to do something similar to: if( (A && !B) || (B && !A) ) { ...

Invertering og Forskydning af Bits

Udover de logiske operatorer findes der operatorer til at invertere og flytte hele sæt af bits.

Bitwise NOT (~)

Bitwise NOT (~) er en unær operator, hvilket betyder, at den kun arbejder på én operand. Den inverterer simpelthen hver eneste bit i tallet: alle 0'er bliver til 1'er, og alle 1'er bliver til 0'er. På grund af den måde, signerede heltal repræsenteres på i computere (via en metode kaldet "2's komplement"), vil resultatet af ~x altid være -(x + 1).

For eksempel, ~12:

  • 12 er 00000000000000000000000000001100
  • ~12 bliver til 11111111111111111111111111110011

Dette binære tal repræsenterer -13 i 2's komplement-format.

Skifteoperatorer (Shift Operators)

Disse operatorer flytter alle bits i den første operand et bestemt antal pladser til venstre eller højre, specificeret af den anden operand.

  • Left Shift (<<): Flytter alle bits til venstre. De nye pladser til højre fyldes op med nuller. Hver venstreforskydning med én plads svarer til at multiplicere tallet med 2. F.eks. er 5 << 1 lig med 10, og 5 << 2 er lig med 20.
  • Sign-propagating Right Shift (>>): Flytter alle bits til højre. De overskydende bits til højre kasseres. De nye pladser til venstre fyldes op med en kopi af den oprindelige venstre-mest bit (sign-bitten). Dette bevarer tallets fortegn (positivt eller negativt). Hver højreforskydning med én plads svarer til at dividere tallet med 2 og fjerne resten (heltalsdivision). F.eks. er 10 >> 1 lig med 5.
  • Zero-fill Right Shift (>>>): Fungerer ligesom >>, men de nye pladser til venstre fyldes altid op med nuller, uanset hvad fortegnsbitten var. Dette betyder, at resultatet altid vil være et positivt heltal. Denne operator er især nyttig, når man arbejder med binære data, hvor fortegnet ikke er relevant.

Sammenligningstabel over Bitvise Operatorer

OperatorNavnBeskrivelseEksempel (a=5, b=1)
&ANDReturnerer 1 hvis begge bits er 1.(a & b) => 1
|ORReturnerer 1 hvis mindst én bit er 1.(a | b) => 5
^XORReturnerer 1 hvis bits er forskellige.(a ^ b) => 4
~NOTInverterer alle bits.~a => -6
<<Left ShiftFlytter bits til venstre, fylder med 0.a << 1 => 10
>>Right ShiftFlytter bits til højre, bevarer fortegn.a >> 1 => 2
>>>Zero-fill Right ShiftFlytter bits til højre, fylder med 0.a >>> 1 => 2

Praktiske Anvendelser

Selvom de kan virke abstrakte, har bitvise operatorer mange praktiske anvendelser, især inden for systemnær programmering, grafik og performance-kritiske applikationer.

  • Rettighedssystemer: Man kan repræsentere forskellige rettigheder (f.eks. læse, skrive, eksekvere) som potenser af 2 (1, 2, 4). En brugers samlede rettigheder kan gemmes som ét enkelt tal. For at tjekke for en specifik rettighed bruger man &. For at tilføje en rettighed bruger man |.
  • Farvemanipulation: Farver i formater som RGB kan repræsenteres som et enkelt heltal. Med skifteoperatorer og masker kan man effektivt isolere og manipulere de individuelle rød-, grøn- og blå-værdier.
  • Optimering: I nogle tilfælde kan bitvise operationer være markant hurtigere end traditionelle matematiske operationer. For eksempel er x << 1 hurtigere end x * 2, og x >> 1 er hurtigere end Math.floor(x / 2). Moderne JavaScript-motorer er dog ofte gode til at optimere dette selv.
  • Datakomprimering og kryptering: Algoritmer inden for disse felter er stærkt afhængige af effektiv manipulation af data på bit-niveau.

Ofte Stillede Spørgsmål (FAQ)

Hvorfor er bitvise operationer hurtigere?

Bitvise operationer oversættes ofte direkte til en enkelt instruktion på processorniveau, mens aritmetiske operationer som multiplikation eller division kan kræve flere instruktioner. Dette gør dem fundamentalt hurtigere på hardware-niveau. Forskellen er dog ofte negligerbar i moderne højniveau-sprog som JavaScript, medmindre de bruges i meget intensive løkker.

Hvad er den præcise forskel mellem `>>` og `>>>`?

Forskellen ligger i, hvordan de håndterer negative tal. >> (Sign-propagating Right Shift) bevarer tallets fortegn ved at kopiere den venstre-mest bit (sign-bitten). Hvis tallet er negativt (starter med 1), vil de nye bits også være 1'ere. >>> (Zero-fill Right Shift) indsætter altid 0'er fra venstre, hvilket betyder, at resultatet altid vil blive fortolket som et positivt tal.

Kan jeg bruge bitvise operatorer på andet end tal?

Nej. De bitvise operatorer i JavaScript fungerer kun på numeriske typer. Hvis du forsøger at bruge dem på en streng eller et objekt, vil JavaScript først forsøge at konvertere værdien til et tal. Hvis dette mislykkes (resulterer i NaN), vil operationen typisk resultere i 0.

Hvad betyder "2's komplement" i forbindelse med Bitwise NOT?

2's komplement er en standardmetode, som computere bruger til at repræsentere signerede (positive og negative) heltal i binær form. For at finde den negative repræsentation af et tal (f.eks. -13), tager man det positive tal (13), inverterer alle dets bits (dette kaldes 1's komplement), og lægger derefter 1 til. Det er præcis denne proces, der forklarer, hvorfor ~x er lig med -(x + 1).

Hvis du vil læse andre artikler, der ligner Forstå Bitvise Operatorer i JavaScript, kan du besøge kategorien Sundhed.

Go up