Setze mit dieser Funktion einzelne Bits auf "0".
inline uint32_t clearBit(uint32_t command, uint8_t bitIndex) {
return command & ~(1 << bitIndex);
}
Lass uns den Code Schritt für Schritt verstehen.
inline
Der Compiler minimiert mit Inlinefunktionen, bei einer positiven Kosten-Nutzen-Analyse, den Mehraufwand, der bei einem Funktionsaufruf zustande kommt. Link
uint32_t clearBit(uint32_t command, uint8_t bitIndex)
Hier findet die Funktionsdefinition statt. Man gibt den Datentyp der Rückgabe (uint32_t), den Namen der Funktion (clearBit) und den Datentyp der Übergabeparameter mitsamt dem Namen (uint32_t command, uint8_t bitIndex) an.
return
Schlüsselwort für die Rückgabe des Statements.
command & ~(1 << bitIndex)
Diese Zeile führt einen "leftshift" der angegebenen "1" um den Wert von "bitIndex" Stellen aus. Danach wird der binäre Wert dieser Operation, zum einen mithilfe des bitweisen AND-Operators (&) und dem bitweisen NOT-Operator (~), mit der übergebenen Variable "command" verglichen.
Beispiel - Funktionsaufruf, Verarbeitung und Ausgabe
Funktionsaufruf:
uint8_t number = 47;
uint8_t index = 3;
printBinary(number);
number = clearBit(number, index);
printBinary(number);
Um den Wert vor und nach der Funktion clearBit() über die serielle Schnittstelle auszugeben, wird die Funktion printBinary() aufgerufen.
Die Variable "number" mit dem Wert 47 (binär 0010 1111) und die Variable "index" mit dem Wert 3 werden an die Funktion clearBit() übergeben. Die Rückgabe wird wieder in die Variable "number" geschrieben.
Verarbeitung:
inline uint32_t clearBit(uint32_t command, uint8_t bitIndex) {
return command & ~(1 << bitIndex);
}
~(1 << bitIndex)
--> erstellt eine Bitmaske, bei der nur das Bit an Position bitIndex auf 0 gesetzt ist. Alle anderen Bits der Maske sind auf 1 gesetzt.
Beispiel: bitIndex = 3 --> ~(1 << 3) = 1111 0111
command & ~(1 << bitIndex)
--> verknüpft die Bitmaske mit dem ursprünglichen Wert command über ein bitweises UND (&).
Dadurch bleibt der ursprüngliche Wert erhalten, aber das Bit an der angegebenen Position wird auf 0 gesetzt.
Beispiel: command = 0010 1111
mask = 1111 0111
result = 0010 0111
return
--> gibt den neuen Wert mit dem gelöschten Bit zurück.
Ausgabe (serielle Schnittstelle):
0010 1111
0010 0111
So wird das Bit an Position 3 auf 0 gesetzt, während alle anderen Bits unverändert bleiben.