Unlocking the Power of Bitwise Operators in C++
The Foundation of Bitwise Operations
In the world of C++ programming, bitwise operators play a crucial role in performing operations on integer data at the individual bit-level. These operators are essential because the Arithmetic-Logic Unit (ALU) present in the computer’s CPU carries out arithmetic operations at the bit-level. However, it’s important to note that bitwise operators can only be used alongside char and int data types.
Bitwise AND Operator: The Gatekeeper
The bitwise AND (&) operator returns 1 if and only if both the operands are 1. Otherwise, it returns 0. This operator is demonstrated in the following truth table:
| a | b | a & b |
| — | — | — |
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
Let’s take a look at the bitwise AND operation of two integers 12 and 25:
Example 1: Bitwise AND Output
In this example, we declare two variables a
and b
, and perform a bitwise AND operation between them. The result is a fascinating demonstration of how bitwise operators work at the bit-level.
Bitwise OR Operator: The Enabler
The bitwise OR (|) operator returns 1 if at least one of the operands is 1. Otherwise, it returns 0. This operator is demonstrated in the following truth table:
| a | b | a | b |
| — | — | — | — |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
Let’s take a look at the bitwise OR operation of two integers 12 and 25:
Example 2: Bitwise OR Output
The bitwise OR of a = 12
and b = 25
gives 29.
Bitwise XOR Operator: The Flipper
The bitwise XOR (^) operator returns 1 if and only if one of the operands is 1. However, if both the operands are 0, or if both are 1, then the result is 0. This operator is demonstrated in the following truth table:
| a | b | a ^ b |
| — | — | — |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
Let’s take a look at the bitwise XOR operation of two integers 12 and 25:
Example 3: Bitwise XOR Output
The bitwise XOR of a = 12
and b = 25
gives 21.
Bitwise Complement Operator: The Inverter
The bitwise complement operator is a unary operator (works on only one operand) denoted by ~ that changes binary digits 1 to 0 and 0 to 1. It’s important to note that the bitwise complement of any integer N is equal to -(N + 1).
Example 4: Bitwise Complement Output
In this example, we declare two integer variables num1
and num2
, and compute their bitwise complement using the codes (~num1)
and (~num2)
respectively.
Shift Operators: The Shapers
There are two shift operators in C++ programming: the right shift operator (>>) and the left shift operator (<<).
C++ Right Shift Operator
The right shift operator shifts all bits towards the right by a certain number of specified bits. When we shift any number to the right, the least significant bits are discarded, while the most significant bits are replaced by zeroes.
C++ Left Shift Operator
The left shift operator shifts all bits towards the left by a certain number of specified bits. When we shift any number to the left, the most significant bits are discarded, while the least significant bits are replaced by zeroes.
Example 5: Shift Operators Output
From the output of the program above, we can infer that, for any number N, the results of the shift right operator are:… and so on. Similarly, the results of the shift left operator are:… and so on.
Bitwise Shift in Actual Practice
In actual practice, the int data type stores numbers in 32-bits, i.e., an int value is represented by 32 binary digits. However, our explanation for the bitwise shift operators used numbers represented in 4-bits. This means that the bitwise left-shift operation for 13 (and any other number) can be different depending on the number of bits they are represented by.