Logical & Bitwise
Overview
To build intelligent applications, your code must make complex decisions combining multiple conditions. Logical Operators (&& AND, || OR, ! NOT) handle standard boolean logic.
However, because C++ is used to program hardware (like Arduino or networking routers), it also provides Bitwise Operators (&, |, ^, <<). These operate at the absolute lowest level possible—manipulating the individual binary 1s and 0s inside a variable's memory space. This is how high-performance game engines pack 8 boolean flags into a single byte of memory.
Syntax
bool isWeekend = true;
bool hasMoney = false;
// --- 1. LOGICAL OPERATORS (Evaluating Truth) ---
// AND: Both must be true
bool goOut = isWeekend && hasMoney; // false
// OR: At least one must be true
bool stayHome = !isWeekend || !hasMoney; // true
// --- 2. BITWISE OPERATORS (Manipulating Binary) ---
int x = 5; // Binary: 0101
int y = 3; // Binary: 0011
int bitAnd = x & y; // 0001 (Decimal 1)
int bitOr = x | y; // 0111 (Decimal 7)
int bitXor = x ^ y; // 0110 (Decimal 6)
// Bitwise Left Shift (Mathematically multiplies by 2!)
int shift = x << 1; // 1010 (Decimal 10)Common Pitfalls
- Using a single
&when you meant&&.if (x > 5 & y < 10)will execute a Bitwise operation instead of a Logical evaluation. While it sometimes accidentally works, it completely bypasses 'Short-Circuiting', destroying your performance. - Not understanding 'Short-Circuit Evaluation'. In
if (A && B), if A is false, C++ completely ignores B (it doesn't even execute the code for B) because the statement is already mathematically guaranteed to be false.
Interview Questions
<< 1) to multiply a number by 2, instead of standard multiplication (* 2)?Standard multiplication requires the CPU's Arithmetic Logic Unit (ALU) to perform complex algorithmic math, taking multiple CPU cycles. A Bitwise Shift physically nudges the bits to the left in the hardware register, taking exactly 1 CPU cycle. It is the absolute fastest way to multiply or divide by powers of 2.
Real-World Example
Using Bitwise Operators to pack multiple boolean settings into a single 8-bit integer, saving massive amounts of RAM in networking packets.
const unsigned char FLAG_READ = 1 << 0; // 0001
const unsigned char FLAG_WRITE = 1 << 1; // 0010
const unsigned char FLAG_EXEC = 1 << 2; // 0100
// Combine permissions using Bitwise OR (|)
unsigned char userPerms = FLAG_READ | FLAG_WRITE; // 0011
// Check a specific permission using Bitwise AND (&)
if (userPerms & FLAG_READ) {
// User is allowed to read!
}Check Your Knowledge
Test your understanding of Logical & Bitwise with these quick questions.