Setze mit dieser Funktion einzelne Bits auf "1".
inline uint32_t setBit(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 setBit(uint32_t command, uint8_t bitIndex)
Hier findet die Funktionsdefinition statt. Man gibt den Datentyp der Rückgabe (uint32_t), den Namen der Funktion (setBit) 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, mithilfe des bitweisen OR-Operators (|), mit der übergebenen Variable "command" verglichen.
Beispiel - Funktionsaufruf, Verarbeitung und Ausgabe
Funktionsaufruf:
uint8_t number = 39;
uint8_t index = 3;
printBinary(number);
number = setBit(number, index);
printBinary(number);
Um den Wert vor und nach der Funktion setBit() über die serielle Schnittstelle auszugeben, wird die Funktion printBinary() aufgerufen.
Die Variable "number" mit dem Wert 39 (binär 0010 0111) und die Variable "index" mit dem Wert 3 werden an die Funktion setBit() übergeben. Die Rückgabe wird wieder in die Variable "number" geschrieben.
Verarbeitung:
inline uint32_t setBit(uint32_t command, uint8_t bitIndex) {
return command | (1 << bitIndex);
}
1 << bitIndex
--> erstellt eine Bitmaske, bei der nur das Bit an Position bitIndex auf 1 gesetzt ist. Alle anderen Bits der Maske sind auf 0 gesetzt.
Beispiel: bitIndex = 3 --> 1 << 3 = 0000 1000
command | 1 << bitIndex
--> verknüpft die Bitmaske mit dem ursprünglichen Wert command über ein bitweises ODER (|).
Dadurch bleibt der ursprüngliche Wert erhalten, aber das Bit an der angegebenen Position wird auf 1 gesetzt.
Beispiel: command = 0010 0111
mask = 0000 1000
result = 0010 1111
return
--> gibt den neuen Wert mit dem gesetzten Bit zurück.
Ausgabe (serielle Schnittstelle):
0010 0111
0010 1111
So wird das Bit an Position 3 auf 1 gesetzt, während alle anderen Bits unverändert bleiben.