Why Bit Manipulation and When It Beats Arithmetic in DSA Typescript - Performance Analysis
We want to see why using bit manipulation can be faster than normal arithmetic operations.
How does the speed change when we use bits instead of usual math?
Analyze the time complexity of the following code snippet.
function multiplyByTwo(num: number): number {
return num << 1; // bit shift left by 1
}
function multiplyByTwoArithmetic(num: number): number {
return num * 2; // normal multiplication
}
This code shows two ways to multiply a number by two: one using bit shifting and one using normal multiplication.
Look at what happens inside each function when called many times.
- Primary operation: Bit shift (<<) in first function, multiplication (*) in second.
- How many times: Each operation runs once per function call.
Both functions do one operation per call, so time does not grow with input size.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 operations |
| 100 | 100 operations |
| 1000 | 1000 operations |
Pattern observation: The time grows linearly with how many times we call the function, not with the number size.
Time Complexity: O(1)
This means each multiplication, whether by bit shift or arithmetic, takes the same fixed time regardless of the number size.
[X] Wrong: "Bit manipulation always runs faster than arithmetic for all operations."
[OK] Correct: Some arithmetic operations are optimized by hardware and run just as fast or faster; bit tricks help mainly for specific tasks like powers of two or flags.
Knowing when bit manipulation is faster helps you write efficient code and shows you understand low-level details, a skill many interviews appreciate.
"What if we used bit manipulation to divide by two instead of multiply? How would the time complexity compare?"
Practice
Solution
Step 1: Understand how bit manipulation works
Bit manipulation uses CPU instructions that directly change bits, which are the smallest data units.Step 2: Compare with arithmetic operations
Arithmetic like multiplication or division involves multiple CPU cycles and more complex calculations.Final Answer:
Because bit manipulation works directly on binary digits using CPU instructions -> Option AQuick Check:
Bit manipulation = faster CPU-level operations [OK]
- Thinking bit manipulation uses more memory
- Believing arithmetic is always faster
- Confusing bit manipulation with complex algorithms
Solution
Step 1: Recall bit shift left operation
Shifting bits left by 1 multiplies the number by 2, so shifting left by 2 multiplies by 4.Step 2: Check each option
num << 2 shifts left by 2 bits, correctly multiplying by 4. num >> 2 performs right shift (division by 4), num & 4 is bitwise AND, and num | 4 is bitwise OR; none multiply by 4.Final Answer:
num << 2 -> Option CQuick Check:
Left shift by 2 = multiply by 4 [OK]
- Using right shift instead of left shift
- Confusing bitwise AND/OR with multiplication
- Forgetting shift counts start at zero
let x = 10; let y = x & 6; console.log(y);
Solution
Step 1: Convert numbers to binary
10 in binary is 1010, 6 in binary is 0110.Step 2: Perform bitwise AND
1010 & 0110 = 0010 (binary), which is 2 in decimal.Final Answer:
2 -> Option AQuick Check:
10 & 6 = 2 [OK]
- Confusing AND with OR operation
- Not converting binary correctly
- Assuming output is decimal sum
function isEven(num: number): boolean {
return (num & 1) === 1;
}Solution
Step 1: Understand bitwise check for even numbers
Even numbers have last bit 0, so (num & 1) equals 0 for even numbers.Step 2: Analyze the condition
The code returns true if (num & 1) === 1, which means odd numbers, so it is reversed.Final Answer:
The condition should check if (num & 1) === 0 to detect even numbers -> Option BQuick Check:
Even check = (num & 1) === 0 [OK]
- Checking for 1 instead of 0 for even
- Thinking bitwise AND can't check parity
- Using modulo instead of bitwise unnecessarily
function doubleManyTimes(num: number, times: number): number {
let result = num;
for (let i = 0; i < times; i++) {
// Which line is best here?
// A: result = result * 2;
// B: result = result << 1;
}
return result;
}Solution
Step 1: Compare multiplication and bit shift performance
Bit shift left is a CPU-level operation that is faster than multiplication, especially in loops.Step 2: Evaluate other options
Addition doubles but is slower than bit shift; division by 0.5 is slower and less clear.Final Answer:
Use bit shift left (result = result << 1) because it's faster and uses less CPU cycles -> Option DQuick Check:
Bit shift left = faster multiply by 2 [OK]
- Choosing multiplication for clarity over speed
- Using addition which is slower than bit shift
- Using division which is inefficient
Ready to prove it?
Pass the test and this pattern moves unknown
