Ga naar hoofdinhoud

Bitwise Operaties

Bitwise operaties werken rechtstreeks op de individuele bits van een getal — positie per positie. Ze zijn razendsnel en duiken op in allerlei praktische toepassingen: kleurmanipulatie, bestandsrechten, netwerkmaskering en encryptie.

Je kunt bitwise operaties uitvoeren in de browser console (F12 → Console) of in een C#-project. De operators zijn in beide talen identiek.

AND (&)

AND geeft een 1 als beide bits 1 zijn, anders 0.

ABA & B
000
010
100
111

Bit voor bit:

1010
& 1100
------
1000

10102&11002=10002=8101010_2 \mathbin{\&} 1100_2 = 1000_2 = 8_{10}

// JavaScript
console.log(0b1010 & 0b1100); // 8
console.log(10 & 12); // 8
// C#
Console.WriteLine(0b1010 & 0b1100); // 8
Console.WriteLine(10 & 12); // 8

AND gebruik je als bitmask: je selecteert specifieke bits en legt de rest op 0.


OR (|)

OR geeft een 1 als minstens één van de bits 1 is.

ABA | B
000
011
101
111

Bit voor bit:

1010
| 0101
------
1111

1010201012=11112=15101010_2 \mathbin{|} 0101_2 = 1111_2 = 15_{10}

// JavaScript
console.log(0b1010 | 0b0101); // 15
console.log(10 | 5); // 15
// C#
Console.WriteLine(0b1010 | 0b0101); // 15
Console.WriteLine(10 | 5); // 15

OR gebruik je om specifieke bits aan te zetten in een getal.


XOR (^)

XOR (eXclusive OR) geeft een 1 als de bits verschillend zijn.

ABA ^ B
000
011
101
110

Bit voor bit:

1010
^ 1100
------
0110

1010211002=01102=6101010_2 \oplus 1100_2 = 0110_2 = 6_{10}

// JavaScript
console.log(0b1010 ^ 0b1100); // 6
console.log(10 ^ 12); // 6
// C#
Console.WriteLine(0b1010 ^ 0b1100); // 6
Console.WriteLine(10 ^ 12); // 6

XOR heeft een bijzondere eigenschap: twee keer XOR-ten met dezelfde waarde geeft het origineel terug. Dat maakt het nuttig voor toggle-operaties en eenvoudige encryptie.


NOT (~)

NOT keert alle bits om: 0 wordt 1, 1 wordt 0.

A~A
01
10
00001010 (10)
~
11110101
// JavaScript
console.log(~10); // -11
console.log(~0); // -1
// C#
Console.WriteLine(~10); // -11
Console.WriteLine(~0); // -1
NOT en negatieve getallen

~ werkt op 32-bit signed integers. Het resultaat is altijd -(n + 1), dus ~5 = -6 en ~10 = -11. Dit heeft te maken met hoe negatieve getallen in binair worden opgeslagen (two's complement).


Bit shifts

Bit shifts schuiven alle bits een of meerdere posities naar links of rechts.

Left shift (<<)

Schuif bits naar links, vul rechts aan met nullen.

00000001 (1)
<< 3
00001000 (8)

Links shiften met nn = vermenigvuldigen met 2n2^n.

13=1×23=81 \ll 3 = 1 \times 2^3 = 8

// JavaScript
console.log(1 << 3); // 8
console.log(5 << 2); // 20
// C#
Console.WriteLine(1 << 3); // 8
Console.WriteLine(5 << 2); // 20

Right shift (>>)

Schuif bits naar rechts, bits die rechts uitvallen gaan verloren.

00001000 (8)
>> 2
00000010 (2)

Rechts shiften met nn = gehele deling door 2n2^n.

82=8÷4=28 \gg 2 = 8 \div 4 = 2

// JavaScript
console.log(8 >> 1); // 4
console.log(8 >> 2); // 2
// C#
Console.WriteLine(8 >> 1); // 4
Console.WriteLine(8 >> 2); // 2

Praktische voorbeelden

Kleurkanalen uitlezen

Een CSS-kleur zoals #FF5733 is intern één 24-bit getal. Met shifts en AND haal je de afzonderlijke kanalen eruit:

// JavaScript
const kleur = 0xFF5733;
const rood = (kleur >> 16) & 0xFF; // 255
const groen = (kleur >> 8) & 0xFF; // 87
const blauw = kleur & 0xFF; // 51
// C#
int kleur = 0xFF5733;
int rood = (kleur >> 16) & 0xFF; // 255
int groen = (kleur >> 8) & 0xFF; // 87
int blauw = kleur & 0xFF; // 51

Oneven of even controleren

De laatste bit is 1 bij oneven getallen en 0 bij even:

// JavaScript
const isOneven = (getal & 1) === 1;
// C#
bool isOneven = (getal & 1) == 1;

Snel vermenigvuldigen of delen door 2

// JavaScript
const verdubbeld = getal << 1; // × 2
const gehalveerd = getal >> 1; // ÷ 2 (geheel)
// C#
int verdubbeld = getal << 1; // × 2
int gehalveerd = getal >> 1; // ÷ 2 (geheel)