Bitweises Komplement / Bitwise NOT
Der NOT-Operator (~) invertiert jedes einzelne Bit einer Zahl.
Beispiel mit 8-Bits:
0000 0100 = 4
~0000 0100 = 1111 1011 = 251
Bitweises UND / Bitwise AND
Der AND-Operator (&) wird auf jedes einzelne Bit zwischen zwei Operanden angewendet. Das Ergebnisbit ist 1, wenn beide Bits den Wert 1 aufweisen.
Beispiel mit 4-Bits:
0001
&1001
-----
0001
Bitweises ODER / Bitwise OR
Der OR-Operator (|) wird auf jedes einzelne Bit zwischen zwei Operanden angewendet. Das Ergebnisbit ist 1, wenn eines der beiden Bits den Wert 1 aufweisen.
Beispiel mit 4-Bits:
0001
|1001
-----
1001
Bitweises exklusives ODER / Bitwise XOR
Der XOR-Operator (^) wird auf jedes einzelne Bit zwischen zwei Operanden angewendet. Das Ergebnisbit ist 1, wenn die beiden Bits unerschiedliche Werte haben.
Beispiel mit 4-Bits:
0001
^1001
-----
1000
Linksverschiebung / Left shift
Bei der bitweise Linksverschiebung (<<) werden alle Bits um die angegebene Position nach links verschoben.
Beispiel mit 4-Bits:
0001 << 1 = 0010
0001 << 2 = 0100
Rechtsverschiebung / Right shift
Bei der bitweise Rechtsverschiebung (>>) werden alle Bits um die angegebene Position nach rechts verschoben.
Beispiel mit 4-Bits:
0010 >> 1 = 0001
0100 >> 2 = 0001
1010 >> 1 = 0101
Bit löschen
Will man in einem Byte mehrere Bits auf 0 setzen, wird dazu die UND-Verknüpfung verwendet.
PORTB &= ~(1 << 0)
Löscht Bit 0
Sollen gleichzeitig mehrere Bits gelöscht werden:
PORTB &= ~((1 << 0) | (1 << 2));
Löscht Bit 0 und 2 in PORTB
Bit invertieren
PORTB ^= (1 << 3);
Invertiere das dritte Bit
Bit setzen
PORTB |= (1 << 2);
Setzt das Bit 2 auf 1
Beispiel Methoden:
void set_PORTB_bit(int8_t position, int8_t value)
{
// Sets or clears the bit in position 'position'
// either high or low (1 or 0) to match 'value'.
// Leaves all other bits in PORTB unchanged.
if (value == 0)
{
// Set bit # 'position' low
PORTB &= ~(1 << position);
}
else
{
// Set bit # 'position' high
PORTB |= (1 << position);
}
}
void set_Pin_Mode(int8_t position, int8_t value){
if (value == 0)
{
// Set bit # 'position' to input
DDRB &= ~(_BV(position));
}
else
{
// Set bit # 'position' to output
DDRB |= (1 << position);
}
}
Nützliche Links
mikrocontroller.net: Bitmanipulation
stackoverflow.com: How do you set, clear and toggle a single bit?