Algorithm Templates: Math & Bit Manipulation
This page collects ready-to-use C++ templates for bit manipulation, fast exponentiation, GCD/LCM, prime sieves, and basic number theory. Each snippet is self-contained — copy it into your solution and adapt as needed. If you’re looking for geometry-related math, see Math & Geometry.
New to Bit Manipulation? Computers store everything in binary. Bit manipulation lets you perform operations on individual bits — it’s incredibly fast and often turns complex problems into elegant one-liners. The most common trick: XOR (
a ^ b) cancels matching bits, which is why it solves “single number” problems.
Contents
Bit Operations
When to use: You need to inspect, set, clear, or toggle individual bits in a number — common in bitmask DP, permission flags, and encoding state compactly.
Basic Operations
# Set bit at position i
def set_bit(num: int, i: int) -> int:
return num | (1 << i)
def clear_bit(num: int, i: int) -> int:
return num & ~(1 << i)
def toggle_bit(num: int, i: int) -> int:
return num ^ (1 << i)
def is_bit_set(num: int, i: int) -> int:
return (num >> i) & 1
def count_set_bits(num: int) -> int:
count = 0
while num:
count += num & 1
num >>= 1
return count
def count_set_bits_kernighan(num: int) -> int:
count = 0
while num:
num &= num - 1
count += 1
return count
Common Bit Tricks
def lowest_set_bit(num: int) -> int:
return num & (-num)
def clear_lowest_set_bit(num: int) -> int:
return num & (num - 1)
def is_power_of_two(num: int) -> bool:
return num > 0 and (num & (num - 1)) == 0
def next_power_of_two(num: int) -> int:
num -= 1
num |= num >> 1
num |= num >> 2
num |= num >> 4
num |= num >> 8
num |= num >> 16
num |= num >> 32
return num + 1
def xor_swap(a: int, b: int) -> tuple[int, int]:
a ^= b
b ^= a
a ^= b
return a, b
| ID | Title | Link | Solution |
|---|---|---|---|
| 29 | Divide Two Integers | Link | Solution |
| 36 | Valid Sudoku | Link | Solution |
| 67 | Add Binary | Link | Solution |
| 191 | Number of 1 Bits | Link | - |
| 231 | Power of Two | Link | - |
| 338 | Counting Bits | Link | - |
| 393 | UTF-8 Validation | Link | Solution |
| 1177 | Can Make Palindrome from Substring | Link | Solution |
| 593 | Valid Square | Link | Solution |
| 2571 | Minimum Operations to Reduce an Integer to 0 | Link | Solution |
Common Bit Tricks
When to use: The problem mentions “single number”, “missing number”, “find the duplicate”, or any scenario where XOR’s self-cancelling property (x ^ x = 0) can isolate an answer.
Single Number
# Single Number (all appear twice except one)
def single_number(nums: list[int]) -> int:
result = 0
for num in nums:
result ^= num
return result
# Single Number II (all appear three times except one)
def single_number_ii(nums: list[int]) -> int:
ones, twos = 0, 0
for num in nums:
ones = (ones ^ num) & ~twos
twos = (twos ^ num) & ~ones
return ones
Gray Code
def gray_code(n: int) -> list[int]:
return [i ^ (i >> 1) for i in range(1 << n)]
| ID | Title | Link | Solution |
|---|---|---|---|
| 136 | Single Number | Link | - |
| 137 | Single Number II | Link | - |
| 89 | Gray Code | Link | Solution |
| 389 | Find the Difference | Link | Solution |
| 260 | Single Number III | Link | Solution |
| 2433 | Find The Original Array of Prefix Xor | Link | Solution |
Fast Exponentiation
When to use: You need to compute x^n (or modular exponentiation) efficiently — e.g. “pow(x, n)”, matrix exponentiation for DP, or any problem requiring O(log n) power computation.
Power Function
# Fast exponentiation: x^n
def my_pow(x: float, n: int) -> float:
N = n
if N < 0:
x = 1 / x
N = -N
result = 1.0
current = x
while N > 0:
if N % 2 == 1:
result *= current
current *= current
N //= 2
return result
| ID | Title | Link | Solution |
|---|---|---|---|
| 50 | Pow(x, n) | Link | Solution |
GCD and LCM
When to use: Problems ask for “greatest common divisor”, “least common multiple”, reducing fractions, or checking divisibility relationships between numbers.
def gcd(a: int, b: int) -> int:
while b:
a, b = b, a % b
return a
def gcd_recursive(a: int, b: int) -> int:
return a if b == 0 else gcd_recursive(b, a % b)
def lcm(a: int, b: int) -> int:
return a // gcd(a, b) * b
Prime Numbers
When to use: Problems involve “count primes”, prime factorization, or need to quickly test whether numbers are prime. The sieve is ideal when you need all primes up to N.
Check Prime
def is_prime(n: int) -> bool:
if n < 2:
return False
if n == 2:
return True
if n % 2 == 0:
return False
i = 3
while i * i <= n:
if n % i == 0:
return False
i += 2
return True
Sieve of Eratosthenes
def sieve_of_eratosthenes(n: int) -> list[bool]:
is_p = [True] * (n + 1)
is_p[0] = is_p[1] = False
for i in range(2, int(n**0.5) + 1):
if is_p[i]:
for j in range(i * i, n + 1, i):
is_p[j] = False
return is_p
Number Theory
When to use: Problems involve digit manipulation (reverse, palindrome), trailing zeroes in factorials, modular arithmetic, or large number operations.
Factorial Trailing Zeroes
def trailing_zeroes(n: int) -> int:
count = 0
while n > 0:
n //= 5
count += n
return count
Reverse Integer
def reverse_int(x: int) -> int:
sign = -1 if x < 0 else 1
x_abs = abs(x)
r = 0
while x_abs:
r = r * 10 + x_abs % 10
x_abs //= 10
r *= sign
if r < -(2**31) or r > 2**31 - 1:
return 0
return r
| ID | Title | Link | Solution |
|---|---|---|---|
| 172 | Factorial Trailing Zeroes | Link | - |
| 7 | Reverse Integer | Link | - |
| 9 | Palindrome Number | Link | - |
| 279 | Perfect Squares | Link | Solution |
| 43 | Multiply Strings | Link | Solution |
| 2539 | Count the Number of Good Subsequences | Link | Solution |
Quick Reference
| Topic | Signal Phrases | Key Trick |
|---|---|---|
| XOR | “single number”, “missing number” | x ^ x = 0, x ^ 0 = x |
| Bit counting | “number of 1 bits”, “counting bits” | n & (n-1) removes lowest set bit |
| Power of 2 | “is power of 2” | n & (n-1) == 0 |
| Fast Exponent | “pow(x,n)”, “modular exponent” | Square-and-multiply |
| GCD/LCM | “greatest common divisor” | Euclidean algorithm |
| Sieve | “count primes” | Sieve of Eratosthenes |
More templates
- Beginner’s Guide: LeetCode Beginner’s Guide
- Math & Geometry: Math & Geometry
- Advanced (bitwise trie): Advanced Techniques
- Master index: Categories & Templates