Themabewertung:
  • 1 Bewertung(en) - 5 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Bitweise Variablenmanipulation in C
#1
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
Zitieren
#2
Danke Holger!
Auf ähnliche Weise lassen sich einzelne Bits nicht nur setzen, sondern auch wieder auslesen.
Also bestimmte Bits in einem Byte mit einer "Maske" UND-verknüpfen und schon kann man erkennen ob
das/die durch die Maske selektierten Bit(s) 0 oder 1 ist/sind.

https://www.arduino.cc/en/Tutorial/BitMask

etwas ausführlicher auch hier: https://www.mikrocontroller.net/articles...nipulation

Ich wollte das eigentlich erst viel später in einer Lektion des Kurses aufgearbeitet wissen, aber da wir parallel nun auch den PIC zum Kurs laufen lassen, ist es nicht verkehrt da schon mal etwas von gehört bzw. gelesen zu haben!

Gruß
Bernhard
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren


Gehe zu: