Understanding these three operations will make your life much easier.
Setting a Bit
The bitwise OR operator is used to set a bit. The following code snippet sets bit x.
Code Block |
---|
language | cpp |
---|
theme | Confluence |
---|
|
extern uint8_t value;
value |= 1 << x; |
...
Code Block |
---|
language | cpp |
---|
theme | Confluence |
---|
|
value |= 1 << 0; |
which results in
Code Block |
---|
language | cpp |
---|
theme | Confluence |
---|
|
0b00000100 | 0b00000001 = 0b00000101 |
Clearing a Bit
The bitwise AND operator can be used to clear a bit. The following code snippet clears bit x:
Code Block |
---|
language | cpp |
---|
theme | Confluence |
---|
|
extern uint8_t value;
value &= ~(1 << x); |
...
Code Block |
---|
language | cpp |
---|
theme | Confluence |
---|
|
~ |
operator is the NOT operator, which flips all the set and unset bits, such that any set bits will be unset, and vice versa.
So every other bit is set, except for the desired bit at position x.
Code Block |
---|
language | cpp |
---|
theme | Confluence |
---|
|
~(1 << 1) = 0b11111101 |
Now, when we AND it to the value, what happens is any bits that are both set will remain set, and any bits that weren't set will remain unset. In addition, for bit x, if it was originally set, it will be ANDed with 0 (and if it wasn't set, it remains unset).
Code Block |
---|
language | cpp |
---|
theme | Confluence |
---|
|
0b00000111 & 0b11111101 = 0b00000101 |
Toggling a Bit
The XOR operator allows you to toggle a bit. The following code snippet toggles bit x.
Code Block |
---|
language | cpp |
---|
theme | Confluence |
---|
|
extern uint8_t value;
value ^= 1 << x; |
...
To check a bit, you can combine the right shift and AND operators. The following code snippet checks bit x.
Code Block |
---|
language | cpp |
---|
theme | Confluence |
---|
|
extern uint8_t value;
bit = (value >> x) & 1; |
...
Code Block |
---|
language | cpp |
---|
theme | Confluence |
---|
|
bit = (value >> 2) & 1; |
Essentially, we've first shifted the value x places to the right
Code Block |
---|
language | cpp |
---|
theme | Confluence |
---|
|
(0b00010111 >> 2) = 0b00000001 |
Then, the AND operator is applied
Code Block |
---|
language | cpp |
---|
theme | Confluence |
---|
|
0b00000101 & 0b00000001 = 0b00000001 |
...