Allgemeines
Um bitweise Verknüpfungen zu machen gibt es unter C im wesentlichen vier Operatoren: &
(für bitweises AND), |
(für bitweises OR), ^
(für bitweises XOR) und ~
(für bitweise NOT). Die ersten drei Operatoren benötigen immer zwei Operanden, z.B. var_a = var_a & var_b;
. Die bitweise Invertierung kann nur auf einen Operanden angewendet werden, z.B. vara = ~varb;
.
Für Zuweisungen gibt es eine Kurzschreibweise, die den Operator vor das Gleichheitszeichen setzt. So bedeutet var_a &= 0x03;
das gleiche wie var_a = var_a & 0x03;
.
C versteht Zahlen in dezimaler Schreibweise (z.B. 1203
) und hexadezimaler Schreibweise (z.B. 0xB2F
). Die Oktale Schreibweise (zur Basis 8) wird sehr selten benutzt (durch führende Null gekennzeichnet z.B. 0433
). Die binäre Schreibweise wird nur von bestimmten Compilern unterstützt, z.B. 0b01010011
.
Bits auf 1 setzen
Mittels verODERung:
A OR 0=A
(Neutralitätsgesetz)A OR 1=1
(Extremalgesetz)
Beispiel
Im Register PORTB sollen die unteren zwei Bits auf eins gesetzt werden, die anderen sollen ihren Zustand behalten:
PORTB |= 0x03; // 0x03->0b00000011
Bits auf 0 setzen
Mittels verUNDung:
A AND 0=0
(Extremalgesetz)A AND 1=A
(Neutralistätsgesetz)
Das Bitmuster, welches vorgibt, welche Bits auf 0 gesetzt werden und welche auf ihrem ursprünglichen Wert bleiben wird auch Maske genannt. Diese Maskierung wird sehr oft bei Abfragen verwendet, weil man nur den Zustand bestimmter Bits kennen möchte.
Beispiel 1
Im Register PORTC soll das Bit 5 auf 0 gesetzet werden, die anderen sollen ihren Zustand behalten:
PORTC &= 0xDF; // 0xDF->0b11011111
Hilfreich bzw. übersichtlicher ist auch manchmal die Invertierung der Maske.
PORTC &= ~0x20; // 0x20->0b00100000
Weiters kann der Schiebeoperator genutzt werden, um eine 1 auf die richtige Position zu schieben. Der Wert 0x20
lässt sich damit so darstellen: 1<<5
(1 um 5 stellen nach links geschoben, also auf Position von Bit 5).
PORTC&=~(1<<5);
Beispiel 2
Eine Anweisung soll nur ausführt werden, wenn Bit 1 im Register PINA
auf 1 ist. Bei if wird immer der True Zweig ausgeführt wenn die Bedingung ungleich 0 ist.
if (PINA&0x02) { // 0x02->0b00000010 // Answeisung }
Bits invertieren
Mittels verXORung:
A XOR 0=A
(Neutralitätsgesetz)A XOR 1=NOT A
Beispiel
Die unteren 4 Bits von PORTA sollen invertiert werden, die anderen Bits sollen ihren Zustand behalten
PORTA^=0x0F; // 0x0F->0b00001111