14.02.2020, 14:11
Hallo Forum,
hier eine kurze Erläuterung von Bit Manipulationen in C am Beispiel einer 8-Bit Variablen.
Es soll das das Bit 0 einer Variablen a auf 1 gesetzt werden, ohne die übrigen Bits (1-7)
zu verändern. Das geht ganz einfach durch eine bitweise ODER Verknüpfung der zu
setzenden Bits mit 1. Alle Bits die mit 1 ODER verknüpft werden, werden zu 1, die übrigen
bleiben unverändert.
a = 0b00000000
ODER 0b00000001
a = 0b00000001
In C könnte man schreiben:
a = a | 0b00000001 oder verkürzt
a |= 0b00000001 oder noch kürzer
a |= (1<<0)
Die zweite Zahl in der Klammer gibt an, an welcher Stelle die „1“ stehen und damit welches
Bit verändert werden soll. Hier Bit 0.
a |= (1<<5) würde z.B. Bit 5 setzen also a = 0b00100000
Ersetzt man die Konstanten durch Variable, kann das Konstrukt auch dynamisch, z.B. in
Schleifen, verwendet werden. Hier ein Beispiel um die Bits 3 bis 6 einer Variable a auf 1 zu
setzen.
for (i=3;i<7;i++) a |= (1<<i);
Einzelne Bits löschen, also auf 0 setzen, geht genauso einfach durch eine bitweise UND
Verknüpfung mit 0. Setzen wir mal Bit 2 einer Variable b auf 0.
b = 0b11111111
UND 0b11111011
b = 0b11111011
Alle Bits die mit 0 UND verknüpft werden, werden zu 0, die übrigen bleiben unverändert.
In C:
b = b &0b11111011 oder
b &= 0b11111011 oder
b &= ~(1<<2)
Die Tilde negiert hier den Wert in der Klammer, so das aus 0b00000100 -> 0b11111011 wird.
Auf diese weise lassen sich auch die Steuerbits in Registern von Microcontrollern manipulieren.
Ich hoffe das ist einigermaßen verständlich und wünsche viel Spaß beim Bitschieben.
Holger
hier eine kurze Erläuterung von Bit Manipulationen in C am Beispiel einer 8-Bit Variablen.
Es soll das das Bit 0 einer Variablen a auf 1 gesetzt werden, ohne die übrigen Bits (1-7)
zu verändern. Das geht ganz einfach durch eine bitweise ODER Verknüpfung der zu
setzenden Bits mit 1. Alle Bits die mit 1 ODER verknüpft werden, werden zu 1, die übrigen
bleiben unverändert.
a = 0b00000000
ODER 0b00000001
a = 0b00000001
In C könnte man schreiben:
a = a | 0b00000001 oder verkürzt
a |= 0b00000001 oder noch kürzer
a |= (1<<0)
Die zweite Zahl in der Klammer gibt an, an welcher Stelle die „1“ stehen und damit welches
Bit verändert werden soll. Hier Bit 0.
a |= (1<<5) würde z.B. Bit 5 setzen also a = 0b00100000
Ersetzt man die Konstanten durch Variable, kann das Konstrukt auch dynamisch, z.B. in
Schleifen, verwendet werden. Hier ein Beispiel um die Bits 3 bis 6 einer Variable a auf 1 zu
setzen.
for (i=3;i<7;i++) a |= (1<<i);
Einzelne Bits löschen, also auf 0 setzen, geht genauso einfach durch eine bitweise UND
Verknüpfung mit 0. Setzen wir mal Bit 2 einer Variable b auf 0.
b = 0b11111111
UND 0b11111011
b = 0b11111011
Alle Bits die mit 0 UND verknüpft werden, werden zu 0, die übrigen bleiben unverändert.
In C:
b = b &0b11111011 oder
b &= 0b11111011 oder
b &= ~(1<<2)
Die Tilde negiert hier den Wert in der Klammer, so das aus 0b00000100 -> 0b11111011 wird.
Auf diese weise lassen sich auch die Steuerbits in Registern von Microcontrollern manipulieren.
Ich hoffe das ist einigermaßen verständlich und wünsche viel Spaß beim Bitschieben.
Holger