Bitweise Operatoren steuern einzelne Bits von Ganzzahltypen:
& — bitweises UND| — bitweises ODER^ — bitweises exklusives ODER~ — bitweises NICHT<< — Linksverschiebung>> — RechtsverschiebungBesonderheiten:
int, unsigned int usw.).>>) von vorzeichenbehafteten Zahlen (signed) kann es zu einer arithmetischen oder logischen Verschiebung kommen — das hängt vom Compiler ab.unsigned Typen, um eine Vorzeichenvergrößerung zu vermeiden.Beispiel:
unsigned int flags = 0; flags |= 0x1; // Setze das 0-te Bit flags &= ~0x2; // Setze das 1-te Bit zurück if ((flags & 0x4) != 0) { /* ... */ } // Überprüfe das 2-te Bit
Was ist der Unterschied bei der Rechtsverschiebung (
>>) zwischen den Typensigned intundunsigned int?
Häufig fehlerhafte Antwort: Man glaubt, dass die Rechtsverschiebung immer Nullen von links einfügt, unabhängig vom Vorzeichen.
Richtige Antwort:
Bei unsigned int fügt die Rechtsverschiebung (>>) immer Nullen ein. Bei signed int wird entweder das Vorzeichen (Einsen, wenn die Zahl negativ ist) oder Nullen eingefügt — das hängt von der Implementierung des Compilers ab (Architektur und Regeln des C-Standards).
Beispiel:
signed int a = -8; unsigned int b = (unsigned int)a; printf("%d\n", a >> 1); printf("%u\n", b >> 1);
Im ersten Fall hängt das Ergebnis vom Compiler ab; im zweiten Fall erfolgt immer eine logische Verschiebung mit Nullen.
Geschichte
Im Code zur Verarbeitung des Protokolls wurden Signalflags im Typ char gespeichert. Der Programmierer wendete eine Verschiebung um 8 Bit (flag << 8) an, was aufgrund von Überlauf und Typanhebungsregeln zum Verlust aller Daten führte – das Ergebnis war immer null.
Geschichte
Lesen von Daten aus einem Netzwerkprotokoll (big-endian). Die Verwendung von bitweisen Operationen zum Zusammenfügen von Bytes wurde nicht mit einer Umwandlung in unsigned unterstützt, was manchmal zu unerwarteten negativen Werten beim Lesen von Strukturfeldern führte.
Geschichte
Die Verwendung von ~ (bitweises NICHT) zum Zurücksetzen von Bits in einem int-Wert (z.B. ~0x80) wurde als 0x7F interpretiert, aber tatsächlich wurde eine negative Zahl -129 produziert, was zu Fehlern in nachfolgenden Berechnungen und logischen Überprüfungen führte.