Bitwise logica werkt met bits, ofwel enen en nullen. In plaats van te werken met de waarheidswaarden true en false zoals bij gewone logica, behandelt bitwise logica de individuele bits uit de binaire representatie van een getal als waarheidswaarden.
Bitwise operaties worden vaak gebruikt in systeemprogrammering, embedded development en bij optimalisaties in softwareontwikkeling, omdat ze snel en direct op het geheugen werken.
Casus
Stel dat je in een programma een reeks vlaggen gebruikt om de status van een printer aan te geven (bijv. papier op, offline, toner op, enz.). Met bitwise logica kun je meerdere van deze statuswaarden efficiënt in één getal combineren en testen.
Hoe zit een bitwise operatie in elkaar?
Bitwise operaties gebruiken operatoren om per bit logische bewerkingen uit te voeren. Je kunt deze zien als het toepassen van logica op twee rijen bits. Hieronder zie je de meestgebruikte bitwise operatoren:
Net zoals bij proposities kunnen we ook hier waarheidstabellen gebruiken, maar dan per bitpositie. Hieronder zie je hoe de bitwise operaties werken per combinatie van bits:
Bit 1
Bit 2
AND
OR
XOR
0
0
0
0
0
0
1
0
1
1
1
0
0
1
1
1
1
1
1
0
De ~ (NOT) operator is unair (werkt op één operand) en keert elke 1 om naar 0 en andersom.
Hoe gebruik je bitwise logica?
Bitwise logica wordt vaak gebruikt in:
Efficiënte data-opslag via bit flags
Lage-level hardware interactie
Systeembesturingen (bijv. microcontrollers)
Versleuteling, maskering en optimalisaties
Statusbeheer
Casus
Stel je ontwikkelt een systeem voor het beheren van printers in een kantooromgeving. Elke printer kan meerdere statussen tegelijk hebben, zoals:
Offline
Papier op
Toner bijna op
Papier is vastgelopen
Dit kan uitgewerkt worden door de statusses bij te houden met een enum om zo bitwise logica toe te passen
// Een printer die zowel offline is als een papierstoring heeft, krijgt de status:PrinterStatus status = PrinterStatus.Offline | PrinterStatus.PaperJam; // 0001 | 1000 = 1001//Je kunt dan eenvoudig testen op individuele problemen met bitwise AND:bool isOffline = (status & PrinterStatus.Offline) != 0;bool hasJam = (status & PrinterStatus.PaperJam) != 0;//Of een printer oké is (dus géén fouten bevat):bool isOk = status == PrinterStatus.Ok;//Print wat de statussen zijnConsole.WriteLine(status); // Ouput: Offline, PaperJamConsole.WriteLine(isOffline); // Ouput: trueConsole.WriteLine(hasJam); // Output: trueConsole.WriteLine(isOk); // Output: false[Flags]enum PrinterStatus{ Ok = 0, Offline = 1, // 0001 PaperEmpty = 2, // 0010 TonerLow = 4, // 0100 PaperJam = 8 // 1000}
[Flags] wordt gebruikt zodat, als je een print wil doen van de status/enum waarden, dan krijg je de string waarde terug in plaats van de int waarde.