5.2: Bitwise operators
- Page ID
- 40733
People learning C are sometimes confused about the bitwise operators &
and |
. These operators treat integers as bit vectors and compute logical operations on corresponding bits.
For example, &
computes the AND operation, which yields 1 if both operands are 1, and 0 otherwise. Here is an example of &
applied to two 4-bit numbers:
1100 & 1010 ---- 1000
In C, this means that the expression 12 & 10
has the value 8.
Similarly, |
computes the OR operation, which yields 1 if either operand is 1, and 0 otherwise.
1100 | 1010 ---- 1110
So the expression 12 | 10
has the value 14.
Finally, ^
computes the XOR operation, which yields 1 if either operand is 1, but not both.
1100 ^ 1010 ---- 0110
So the expression 12 ^ 10
has the value 6.
Most commonly, &
is used to clear a set of bits from a bit vector, |
is used to set bits, and ^
is used to flip, or “toggle” bits. Here are the details:
Clearing bits: For any value \( x \), \( x\ \& \ 0 \) is 0, and \( x\ \& \ 1 \) is \( x \). So if you AND a vector with 3, it selects only the two rightmost bits, and sets the rest to 0.
xxxx & 0011 ---- 00xx
In this context, the value 3 is called a “mask” because it selects some bits and masks the rest.
Setting bits: Similarly, for any \( x \), \( x\ | \ 0 \) is \( x \), and \( x\ | \ 1 \) is 1. So if you OR a vector with 3, it sets the rightmost bits, and leaves the rest alone:
xxxx | 0011 ---- xx11
Toggling bits: Finally, if you XOR a vector with 3, it flips the rightmost bits and leaves the rest alone. As an exercise, see if you can compute the two’s complement of 12 using ^
. Hint: what’s the two’s complement representation of -1?
C also provides shift operators, <<
and >>
, which shift bits left and right. Each left shift doubles a number, so 5 << 1
is 10, and 5 << 2
is 20. Each right shift divides by two (rounding down), so 5 >> 1
is 2 and 2 >> 1
is 1.