Bitwise operators beheren afzonderlijke bits van gehele numerieke types:
& — bitwise EN| — bitwise OF^ — bitwise XOR~ — bitwise NIET<< — links verschuiven>> — rechts verschuivenKenmerken:
int, unsigned int, enz.).>>) kunnen aritmetische of logische verschuiving veroorzaken — afhankelijk van de compiler.unsigned types gekozen om tekenextensie te vermijden.Voorbeeld:
unsigned int flags = 0; flags |= 0x1; // Zet de 0e bit flags &= ~0x2; // Reset de 1e bit if ((flags & 0x4) != 0) { /* ... */ } // Controleer de 2e bit
Wat is het verschil tussen de rechterschuiving (
>>) voorsigned intenunsigned inttypes?
Vaak foutief antwoord: Er wordt aangenomen dat de rechterschuiving altijd nullen aan de linkerzijde invoegt, ongeacht het teken.
Correct antwoord:
Voor het type unsigned int voegt de rechterschuiving (>>) altijd nullen toe. Voor signed int wordt ofwel het teken (éénheden, als het getal negatief is) of nullen ingevoegd — afhankelijk van de implementatie van de compiler (architectuur en regels van de C-standaard).
Voorbeeld:
signed int a = -8; unsigned int b = (unsigned int)a; printf("%d\n", a >> 1); printf("%u\n", b >> 1);
In het eerste geval hangt het resultaat af van de compiler; in het tweede geval is het altijd een logische verschuiving met nullen.
Verhaal
In de code voor protocolverwerking werden signaalvlaggen opgeslagen in een type char. De programmeur paste een verschuiving van 8 bits toe (flag << 8), wat door overloop en regels voor typeverhoging leidde tot verlies van alle gegevens — result was altijd nul.
Verhaal
Het lezen van gegevens uit een netwerprotocoll (big-endian). Het gebruik van bitwise operaties voor het combineren van bytes ging niet gepaard met conversie naar unsigned, wat soms leidde tot onverwachte negatieve waarden bij het lezen van een struct-veld.
Verhaal
Het gebruik van ~ (bitwise NIET) voor het resetten van bits in een waarde van type int (bijvoorbeeld ~0x80) werd geïnterpreteerd als 0x7F, maar resulteerde in werkelijkheid in een negatief getal -129, wat leidde tot fouten bij latere berekeningen en logische controles.