Setting and resetting bits in a number
In microcontroller code (and other places that use “flags”), you often need to set a specific bit to 0 or 1 in a register.
The bit number is given by an index
. REGISTER
here is the register or variable being modified.
This example is in C, though the syntax is similar in many programming languages.
// Setting a specific bit to 1 REGISTER |= (1 << index); // Setting a specific bit to 0 REGISTER &= ~(1 << index);
Setting
|=
is like +=
. The latter adds the right operand to the value of the variable and then assigns the resulting value to the variable on the left. In this case we’re using a bitwise OR instead.
(1 << index)
takes the value 1
and bit-shifts it index
positions to the left, padding with 0
s on the right. With an index
of 3
, this produces 1000
(in binary).
A bitwise OR means that all bits where the our constructed value have a 0
will be kept as they were in the variable. Where the right operand’s bit is 1, the variable’s value will be set to 1 regardless of what was in there.
Resetting
&=
operates like the |=
as describe before, but performs a bitwise AND operation.
the ~
before (1 << index)
is a bitwise NOT, meaning it flips all 0
s to 1
s and vice versa.
In this case, re-using our index
of 3
, we got 1000
-> NOT -> 0111
. Essentially all bits in the number not at position 3
will be 1
instead of 0
.
A bitwise AND then means that we keep all values as they were in the variable, where the matching bit in the right operand is 1
. Where it is 0
, it will be set to 0
.
Further reading: Bitwise operation on Wikipedia