Linux C Programmeren Handleiding Deel 13 – Bitwise Operatoren (Basis)

Tot nu toe hebben we in deze doorlopende C programmeer-tutorial serie meerdere soorten operatoren besproken, zoals rekenkundig, logisch, relationeel, en toewijzing. Er is echter nog een soort operatoren die heel integraal zijn in de C programmeertaal. We hebben het over bitwise operatoren.

Zoals je nu misschien al weet, wordt elke variabele die je in je C programma gebruikt in de vorm van bytes in het geheugen opgeslagen. Verder zijn deze bytes verdeeld in elk 8 bits. Een bit kan ofwel 1 ofwel 0 zijn. Bijvoorbeeld, als a een kort geheel getal is (dat twee bytes in beslag neemt) met waarde 1, dan wordt op geheugenniveau a als volgt voorgesteld:

00000000 00000001

Evenzo, als b 3 is, dan is dit hoe het in het geheugen wordt voorgesteld:

00000000 00000011

Opmerking: Gahierheen om meer te leren over hoe gehele getallen in de vorm van bits in het geheugen worden weergegeven.

De bitwise operatoren die we hier gaan bespreken werken op deze bits. Laten we beginnen met de bitwise AND operator, die wordt voorgesteld door &. Het neemt twee binaire voorstellingen van gelijke lengte en voert een logische EN bewerking uit op overeenkomstige bits.

Bij een logische EN bewerking is alleen wanneer beide overeenkomstige bits 1 zijn, het resultaat 1. Anders is het resultaat 0. Dus als je het volgende doet:

a & b

Waar ‘a’ 1 is en ‘b’ 3 (zoals beschreven in het begin van deze handleiding), dan levert de bewerking het volgende resultaat op:

00000000 00000001

Dit komt omdat als je de bitrepresentaties van ‘a’ en ‘b’ logisch ANDERT, alleen het meest rechtse bit ‘1’ blijft en alle andere bits ‘0’ worden. In integer (of preciezer, decimaal) vorm blijkt deze bitrepresentatie ‘1’ te zijn.

Hier is de code voor deze bewerking:

#include <stdio.h>

int main()
{
short a = 1;
short b = 3;
printf("a & b = %i", a&b);

return 0;
}

En hier is de uitvoer van deze code:

a & b = 1

Net als & zijn er nog andere bitwise operatoren. Hier is de complete lijst:

&  - AND 
| - inclusive OR
^ - exclusive OR
<< - left shift
>> - right shift
~ - one's complement or NOT

De OR operator (|) voert logische inclusieve OR bewerkingen uit op overeenkomstige bits van zijn operanden – als een van de bits 1 is, is het resulterende bit ook 1, anders is het resulterende bit 0. De exclusieve OR (of XOR) operator werkt ongeveer zoals de OR operator, alleen dat het resulterende bit 0 is als beide bits 0 of 1 zijn.

De linker verschuivingsoperator verschuift de bits het aantal keren dat de tweede operand aangeeft. Bijvoorbeeld, de volgende regel zorgt ervoor dat de bits van ‘a’ 3 keer naar links verschoven worden.

a << 3

Als ‘a’ een kort geheel getal met waarde 1 was, dan was zijn bitrepresentatie iets als:

00000000 00000001

Maar na de linkse verschuiving werd zijn bitrepresentatie:

00000000 00001000

Je ziet dus dat elk bit 3 keer verschoven is, waardoor bit met waarde ‘1’ op de vierde positie komt (en de vrijgekomen bitposities met ‘0’s opgevuld worden). Dus nu wordt de decimale waarde van ‘a’ 8.

Op dezelfde regels schuift de rechter verschuivingsoperator (>>) de bits naar rechts. Tenslotte inverteert de one’s complement of NOT operator – die de enige unary operator in deze lijst is – alle bits (of voert logische negatie uit op elk bit) van de operand. Bijvoorbeeld, als ‘a’ een één byte variabele is, en in het geheugen op de volgende manier wordt voorgesteld:

11111110

Dan zal ~a het maken:

00000001

Merk op dat bitwise operatoren alleen toegepast kunnen worden op char, short, int, en lange variabelen (zowel getekend als niet getekend).

Conclusie

Ik hoop dat ik het basisconcept van bitwise operatoren duidelijk heb kunnen maken. Natuurlijk zijn er enkele scenario’s zoals het toepassen van verschuivingsoperatoren op ondertekende waarden, en praktische voorbeelden van bitwise operatoren die we hier niet behandeld hebben. Maar die komen zeker aan bod in een volgende leerprogramma.