Wie auch beim Bit prüfen stehen auch beim Setzen einzelner Bits verschiedene Methoden zur Verfügung. Erst möchte ich die Inline-Variante aufzeigen. Beim Setzen eines Bits muss lediglich das Byte mit der Bitmaske (hier 0000 0100) „verodert“ werden.
//Bitnummer 2 setzen
int x = 0x9; // Bitmuster 0000 1001
x = x | 0x4; // gesetzt weil 0x4 -> 0000 0100
Beim Zurücksetzen (löschen) eines Bits muss die Bitmaske negiert werden um dann mit dem Byte „verundet“ zu werden. Klingt seltsam – ist es aber nicht.
//Bitnummer 2 löschen
int x = 0xd; // Bitmuster 0000 1101
x = x & (~0x4); // gelöscht weil ~0x4 -> 1111 1011
Natürlich besteht auch hier die Möglichkeit das Ganze in eine Funktion zu packen. Das Ergebnis einer Schiebe-Operation ist in der Regel ein int. Deshalb auch der Cast in ein BYTE um die Compiler-Warnungen zu unterbinden.
//Bit setzen / löschen
BYTE SetBit(BYTE data, BYTE Bit, BOOL value)
{
BYTE mask = (BYTE)(0x1 << Bit);
if(value == TRUE)
return (BYTE)(data | mask);
else
return (BYTE)(data & (~mask));
}
So wird die neue Funktion verwendet
BYTE x = 0x9; // Bitmuster 0000 1001
x = SetBit(x, 2, TRUE); // x = 0000 1101
x = SetBit(x, 3, FALSE); // x = 0000 0101