Skip to content
advancedPhase 7 · Advanced Topics

Bit Manipulation

Master bitwise operations for optimization and clever algorithms.

1h 15m
6 problems
Topic Progress0%

Bit Manipulation Fundamentals

Common Bit Operations

Basic Operations

// Check if bit i is set
boolean isSet(int n, int i) {
    return (n & (1 << i)) != 0;
}

// Set bit i
int setBit(int n, int i) {
    return n | (1 << i);
}

// Clear bit i
int clearBit(int n, int i) {
    return n & ~(1 << i);
}

// Toggle bit i
int toggleBit(int n, int i) {
    return n ^ (1 << i);
}

// Get lowest set bit
int lowestSetBit(int n) {
    return n & (-n);
}

Useful Tricks

// Check if n is power of 2
boolean isPowerOfTwo(int n) {
    return n > 0 && (n & (n - 1)) == 0;
}

// Count set bits (Brian Kernighan's algorithm)
int countBits(int n) {
    int count = 0;
    while (n != 0) {
        n &= (n - 1); // Clear lowest set bit
        count++;
    }
    return count;
}

// Swap without temp variable
void swap(int a, int b) {
    a ^= b;
    b ^= a;
    a ^= b;
}

// Find unique element (all others appear twice)
int findUnique(int[] nums) {
    int result = 0;
    for (int num : nums) {
        result ^= num;
    }
    return result;
}

Bitmask Operations

// Generate all subsets of set with n elements
void generateSubsets(int n) {
    for (int mask = 0; mask < (1 << n); mask++) {
        // Process subset represented by mask
        for (int i = 0; i < n; i++) {
            if ((mask & (1 << i)) != 0) {
                // Element i is in the subset
            }
        }
    }
}

// Check if subset s1 is subset of s2
boolean isSubset(int s1, int s2) {
    return (s1 & s2) == s1;
}

// Union of two sets
int union(int s1, int s2) {
    return s1 | s2;
}

// Intersection of two sets
int intersection(int s1, int s2) {
    return s1 & s2;
}

Time Complexity

  • All basic bit operations: O(1)
  • Iterating over all subsets: O(2^n)
  • Counting bits: O(number of set bits)

Advanced Bit Manipulation

Bit Manipulation DP

Traveling Salesman Problem (TSP)

public int tsp(int[][] dist) {
    int n = dist.length;
    int[][] dp = new int[1 << n][n];
    
    // Initialize with infinity
    for (int[] row : dp) Arrays.fill(row, Integer.MAX_VALUE / 2);
    dp[1][0] = 0; // Start at city 0
    
    for (int mask = 1; mask < (1 << n); mask++) {
        for (int u = 0; u < n; u++) {
            if ((mask & (1 << u)) == 0) continue;
            
            for (int v = 0; v < n; v++) {
                if ((mask & (1 << v)) != 0) continue;
                
                int newMask = mask | (1 << v);
                dp[newMask][v] = Math.min(
                    dp[newMask][v],
                    dp[mask][u] + dist[u][v]
                );
            }
        }
    }
    
    // Find minimum cost to visit all cities and return to 0
    int fullMask = (1 << n) - 1;
    int minCost = Integer.MAX_VALUE;
    for (int u = 1; u < n; u++) {
        minCost = Math.min(minCost, dp[fullMask][u] + dist[u][0]);
    }
    return minCost;
}

Single Number II (Appears Three Times)

public int singleNumber(int[] nums) {
    int ones = 0, twos = 0;
    
    for (int num : nums) {
        ones = (ones ^ num) & ~twos;
        twos = (twos ^ num) & ~ones;
    }
    
    return ones;
}

Bitwise AND of Numbers Range

public int rangeBitwiseAnd(int left, int right) {
    int shift = 0;
    while (left != right) {
        left >>= 1;
        right >>= 1;
        shift++;
    }
    return left << shift;
}

Reverse Bits

public int reverseBits(int n) {
    int result = 0;
    for (int i = 0; i < 32; i++) {
        result <<= 1;
        result |= (n & 1);
        n >>= 1;
    }
    return result;
}

Practice Problems

0/1solved
Single Number
XOR Bit Manipulation

Given a non-empty array of integers nums, every element appears twice except for one. Find that single one. You must implement a solution with a linear runtime complexity and use only constant extra space.

Example:

Input: nums = [2,2,1]

Output: 1

1 is the single number.

Solution
```java
public int singleNumber(int[] nums) {
    int result = 0;
    for (int num : nums) {
        result ^= num;
    }
    return result;
}
```

XOR Properties:
- a ^ a = 0 (same numbers cancel)
- a ^ 0 = a (XOR with 0 is identity)
- XOR is commutative and associative

Edge Cases:

  • Single element array
  • Negative numbers
  • Large array with many duplicates

Quiz

1. What is the result of n & (n-1)?

Question 1 options

2. How do you check if a number is a power of 2 using bit manipulation?

Question 2 options

3. What is the primary purpose of Bit Manipulation?

Question 3 options

4. What is a common mistake when implementing Bit Manipulation?

Question 4 options

Flashcards

Question

What does XOR (^) do when the same number is applied twice?

Answer

a ^ a = 0. XORing a number with itself gives 0. This property is used to find unique elements in arrays where all others appear twice.

Question

How do you generate all subsets of a set using bitmasks?

Answer

For n elements, iterate mask from 0 to 2^n - 1. If bit i is set in mask, element i is in the subset. This enumerates all 2^n subsets.

Question

What is Bit Manipulation?

Answer

Bit Manipulation is a key concept in software engineering.

Question

When to use Bit Manipulation?

Answer

Use Bit Manipulation when building production systems that require reliability, scalability, and maintainability.

Question

Bit Manipulation best practices

Answer

Follow SOLID principles, write clean code, test thoroughly, document decisions, and monitor in production.

Revision Notes

Key Takeaways

  • 1.XOR is powerful for finding unique elements (a ^ a = 0)
  • 2.n & (n-1) clears the lowest set bit - useful for counting bits
  • 3.Bitmasks can represent subsets for combinatorial problems
  • 4.Most bit operations are O(1) constant time
  • 5.Bit manipulation often provides elegant, space-efficient solutions

Interview Tips

  • XOR problems: look for pairs that cancel out
  • Use bitmasks when you need to track subset membership
  • Remember: n & (n-1) clears lowest set bit
  • For power of 2: check n > 0 && (n & (n-1)) == 0
  • Practice: Single Number, Number of 1 Bits, Counting Bits, Bitwise AND of Numbers Range

Cheat Sheet

Bit Manipulation Cheat Sheet

Common Operations

n & (1 << i)     // Check if bit i is set
n | (1 << i)     // Set bit i
n & ~(1 << i)    // Clear bit i
n ^ (1 << i)     // Toggle bit i
n & (-n)         // Lowest set bit
n & (n - 1)      // Clear lowest set bit

Useful Properties

  • a ^ a = 0
  • a ^ 0 = a
  • a & a = a
  • a | a = a
  • ~0 = all 1s

Key Tricks

  1. Power of 2: n > 0 && (n & (n-1)) == 0
  2. Count bits: n &= (n-1) in loop
  3. Swap: a ^= b; b ^= a; a ^= b;
  4. Unique element: XOR all elements

Bitmask DP

  • Use bits to represent subsets
  • 1 << n: total subsets
  • mask | (1 << i): add element i
  • mask & (1 << i): check if i in subset

Applications

  1. Find single number (XOR)
  2. Generate all subsets
  3. TSP with bitmask DP
  4. Count set bits
  5. Power of 2 checks