Bitweise Operatoren

Aus Lowlevel

Wechseln zu: Navigation, Suche

Bitweise Operatoren sind Operatoren die (Binär-)Zahlen Bit für Bit verarbeiten.

Inhaltsverzeichnis

Operatoren

NOT

Der NOT-Operator ist ein unärer Operator, d. h. er arbeitet mit nur einem Argument. Seine Funktion ist es, einen Bit-String Bit für Bit umzudrehen (aus 1 wird 0 und aus 0 wird 1). Bsp.:

NOT ( 11011010b ) = 00100101b

C-Code:

int a = ~0xda; // a = 0x25

ASM-Code:

mov al, 11011010b
not al  ; al = 00100101b

AND

Der AND-Operator veknüpft zwei Bit-Strings miteinander über ein logisches und. Das Bit im Zielstring wird genau dann gesetzt, wenn die beiden entsprechenden Bits der Quellstrings 1 sind.

Bsp.:

(11001100b AND 01100110b) = 01000100b

    11001100b
AND 01100110b
-------------
    01000100b

C-Code:

int a = (0xcc & 0x66); // a = 0x44

ASM-Code:

mov al, 11001100b
and al, 01100110b  ; al = 01000100b

OR

Der OR-Operator verknüpft zwei Bit-Strings über das logische oder. Im Zielstring wird das Bit gesetzt, wenn mindestens eines der beiden Bits der Quellstrings 1 ist.

Bsp.:

(11001100b OR 01100110b) = 11101110b

    11001100b
OR  01100110b
-------------
    11101110b

C-Code:

int a = (0xcc | 0x66); // a = 0xee

ASM-Code:

mov al, 11001100b
or al, 01100110b   ; al = 1110111b

XOR

Der XOR-Operator verknüpft zwei Bit-Strings über ein exklusives logisches oder. Das Bit im Zielstring wird nur dann gesetzt, wenn genau eines der beiden entsprechenden Bits in den Quellstrings 1 ist.

Bsp.:

(11001100b XOR 01100110b) = 10101010b

    11001100b
XOR 01100110b
-------------
    10101010b

C-Code:

int a = (0xcc ^ 0x66); // a = 0xaa

ASM-Code

mov al, 11001100b
xor al, 01100110b   ; al = 10101010b

Anwendung

Besonders bei hardwarenaher Programmierung kann man auf die Bit-Operatoren kaum verzichten. Sie sind nötig, da in Hardware einzelnen Bits oft dazu dienen einen Zustand der Hardware wiederzuspiegeln: Sie dienen als Flags. Da Software über die CPU aber immer nur auf Bytes zugreifen kann, und so den Zustand einzelner Bits nicht überprüfen kann verwendet man die Bit-Operatoren, um z. B. irrelevante Bits zu löschen oder bestimmte Bits zu setzen ohne den Zustand der anderen Bits zu beeinflussen.

Bits löschen

Um bestimmte Bits in einem oder mehreren Bytes zu löschen wird eine (Bit-)Maske benötigt. Die Maske gibt an welche Bits gelöscht werden sollen. Angenommen du hast ein Byte, dessen 5. Bit unbedingt 0 sein muss, weil es für eine Hardware-Funktion steht, die du ausschalten willst. Du erstellst dir also eine Maske in der nur das 5. Bit gesetzt ist: 00100000b.

Um das Bit jetzt löschen zu können invertierst du die Maske zunächst mit NOT

NOT(00100000b) = 11011111b

und Verknüpfst dein Byte per AND mit dem Resultat

(????????b AND 11011111b) = ??0?????b

Das ganze funktioniert natürlich auch mit mehreren Bits gleichzeitig.

C-Code:

PORTx &= ~(1 << BitNummer);  // Bit in PORTx löschen

Bits setzen

Wie beim Löschen eines Bits wird auch hier eine (Bit-)Maske benötigt. Allerdings gibt sie diesmal an, welches Bit gesetzt werden soll. Um z. B. die Bits 1,4,5 auf 1 zu setzen erstellt man sich als Maske: 00110010b Im Gegensatz zum Löschen wird jetzt allerdings mit einem einfachen OR verknüpft.

(????????b OR 00110010b) = ??11??1?b

C-Code:

PORTx |=  (1 << BitNummer);  // Bit in PORTx setzen 

Bit testen

Oft muss man auch testen, ob ein Bit gesetzt ist, um z.B. zu erfahren, ob man aus einem Port lesen darf. Dafür löscht man einfach alle Bits, die nicht betrachtet werden sollen mithilfe der AND Verknüpfung. Ist das Resultat 0, dann war das betrachtete Bit gelöscht, andernfalls war es gesetzt.

(????????b AND 00100000b) = 00?00000b

C-Code:

if (PORTx & (1 << BitNummer) == 0) //bit gelöscht
else //bit gesetzt
Persönliche Werkzeuge