Bitoperatoren zijn aan de programmeertaal C toegevoegd voor handig lage-niveau werken met gegevens en hardware: registerinstelling, masking, vermenigvuldigen en delen door een macht van twee. De regels voor hun werking zijn ontstaan in de tijd van 8- en 16-bits processors.
Vaak maken mensen fouten bij het verschuiven van signed types, omdat het resultaat afhangt van de implementatie (arithmetische of logische verschuiving), evenals bij overschrijding van de grootte van het type. Fouten leiden tot gegevensbeschadiging, incorrecte berekeningen, ongedefinieerd gedrag.
Linksverschuiving (<<): equivalent aan het vermenigvuldigen van de waarde met 2 tot de macht k (a << k). Vul altijd nullen in aan de rechterkant.
Rechtsverschuiving (>>): voor unsigned waarden worden nullen aan de linkerkant ingevuld (logische verschuiving), en voor signed kan het worden ingevuld met het tekenbit (arithmetische verschuiving) of met nullen (gedrag hangt af van de compiler).
Voorbeeld:
unsigned int x = 5; // 0000 0101 unsigned int y = x << 1; // 0000 1010 == 10 int z = -4; // 1111 1100 (als 8 bit) int w = z >> 1; // Kan 1111 1110 (-2) overblijven of 0111 1110 (afhankelijk van de implementatie)
Belangrijkste kenmerken:
Wat gebeurt er bij het rechtsschuiven van een negatief getal met >>?
Het resultaat hangt af van de implementatie: meestal is dit een arithmetische verschuiving met behoud van het teken, maar de standaard garandeert dit niet!
Wat is het resultaat van een verschuiving met een aantal bits meer dan de bitbreedte van het type?
Ongedefinieerd gedrag. Bijvoorbeeld, 1 << 32 voor een 32-bits type kan alles opleveren of zelfs de werking van het programma verstoren.
Kan ik bitoperatoren gebruiken voor drijvende getallen?
Nee, standaard types float, double ondersteunen geen bitbewerkingen. Alleen integer types.
Een programmeur verschob een int met 32 om een masker te vormen - op sommige platforms leidde dit tot nul, op andere tot een onherkenbare waarde.
Voordelen:
Nadelen:
In plaats daarvan werden unsigned waarden en masking van het aantal bits met macro's gebruikt, met duidelijke documentatie en controle van de lengte van het type via sizeof.
Voordelen:
Nadelen: