Das Verfahren der Bitmanipulation wird dazu verwendet um einzelne Bits zu ändern, obwohl mit den bitweisen Verknüpfungsoperatoren (&, |, ^, ~) immer nur auf das gesamte Register zugegriffen werden kann.

Um beispielsweise den vierten Pin an Port B auf High-Pegel zu schalten, muss das vierte Bit im Register PORTB auf Eins gesetzt werden, ohne dabei die anderen sieben Bits dieses Registers zu verändern. Hierzu ist ein Maskierungsoperand (Bitmaske) nötig, der die Manipulationsbits enthält und mit dem zu manipulierendem Register durch eine Operation verknüpft wird.

Abb.: Prinzip Verknüpfung; Quelle: BBS2 Wolfsburg


In der dargestellten Skizze ist a der Inhalt des zu manipulierenden Registers, b entspricht der Bitmaske, und c stellt das Ergebnis der bitweisen Verknüpfung dar. Wenn das Ergebnis c wieder dem gegebenen Register zugewiesen wird, dann wird durch die gegebene Operation tatsächlich der Registerinhalt verändert (a ist dann also der Registerinhalt vor der Manipulation, c ist der Inhalt nach der Manipulation).


Möglichkeiten der Bitmanipulation:


  • Setzen von Bits

Zum Setzen werden in der Bitmaske die betroffenen Bits auf 1 gesetzt, während die restlichen Bits 0 sein müssen. Das zu manipulierende Register wird mit der Bitmaske bitweise ODER-verknüpft.

Beispiel: die Anweisung PORTB = PORTB | 0b00010001; setzt das nullte und das vierte Bit im Register PORTB. Die anderen 6 Bits des Registers bleiben unverändert.


  • Löschen von Bits

Zum Löschen werden in der Bitmaske die betroffenen Bits auf 0 gesetzt, während die restlichen Bits 1 sein müssen. Das zu manipulierende Register wird mit der Bitmaske bitweise UND-verknüpft.

Beispiel: die Anweisung PORTB = PORTB & 0b11101111; löscht das vierte Bit in PORTB, während die anderen 7 Bits des Registers unverändert bleiben.


  • Toggeln von Bits

(Toggeln = Wechsel des Zustandes. Ist ein Bit gleich 1, so wird es zu 0 "getoggelt"; ist es gleich 0, so wird es durch das Toggeln zu 1.)

Zum Toggeln werden in der BItmaske die betroffenen Bits auf 1 gesetzt, während die restlichen Bits auf 0 gesetzt werden. Das zu manipulierende Register wird mit der Bitmaske bitweise XOR-verknüpft.

Beispiel: die Anweisung PORTB = PORTB ^ 0b00110000; toggelt das vierte und fünfte Bit von PORTB, während die anderen 6 Bits unverändert bleiben.



Möglichkeiten zur Angabe der Bitmaske:

  • binär: 0bBBBBBBBB
  • hexadezimal: 0xHH
  • dezimal: DD
  • Schiebebefehl: (1<<X1)|(1<<X2)|...

B: Binärziffer (0 oder 1); H: Hexziffer (0-9 oder A-F); D: Dezimalziffer (0-9); X1,X2: Anzahl Bits, um die geschoben wird


Verkürzte Schreibweise der Anweisungen:

  • PORTB = PORTB "Operation" "Bitmaske"
    z.B. PORTB = PORTB | 0b00110000;
  • PORTB "Operation"= "Bitmaske"
    z.B. PORTB |= 0b00110000;


Positive Logik beim Löschen von Bits:

Üblicherweise möchte man die Bitmaske in positiver Logik darstellen, d.h. dass die Positionen zu verändernder Bits mit einer 1 besetzt werden, während die nicht zu verändernden Bits eine 0 bekommen. Beim Löschen von Bits ist der Operand zunächst umgekehrt, also in negativer Logik aufgebaut, die Bitmaske hat an der zu löschenden Stelle eine 0. Abhilfe schafft hier die Verwendung den Negierungsoperator, was die Lesbarkeit verbessern und besonders bei Schiebebefehlen die Anweisung deutlich verkürzen kann.

Zum Beispiel können die Anweisung, die das vierte Bit löschen, mit binärer Bitmaske und Schiebebefehl

  • PORTB = PORTB & 0b11101111;   bzw.   PORTB = PORTB & ((1<<0) | (1<<1) | (1<<2) | (1<<3) | (1<<5) | (1<<6) | (1<<7));

durch folgende Anweisungen ersetzt werden:

  • PORTB = PORTB & ~0b00010000;   bzw.   PORTB = PORTB & ~(1<<4);


Ein hilfreicher Link zu diesem Thema ist: https://www.mikrocontroller.net/articles/Bitmanipulation

Zuletzt geändert: Mittwoch, 19. Januar 2022, 09:40