Bit Manipulation Basics AND OR XOR NOT Left Right Shift in DSA Go - Time & Space Complexity
Bit manipulation operations are basic steps computers use to handle numbers at the smallest level.
We want to know how the time to do these operations changes as the size of the number grows.
Analyze the time complexity of the following code snippet.
func bitOperations(x, y uint32) (uint32, uint32, uint32, uint32, uint32, uint32) {
and := x & y
or := x | y
xor := x ^ y
not := ^x
leftShift := x << 1
rightShift := x >> 1
return and, or, xor, not, leftShift, rightShift
}
This code performs basic bitwise AND, OR, XOR, NOT, and shifts on two 32-bit numbers.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Each bitwise operation processes all bits of the input numbers.
- How many times: For 32-bit numbers, each operation touches 32 bits once.
Each operation looks at every bit once, so the work grows directly with the number of bits.
| Input Size (bits) | Approx. Operations |
|---|---|
| 8 | 8 operations per bitwise call |
| 32 | 32 operations per bitwise call |
| 64 | 64 operations per bitwise call |
Pattern observation: Doubling the number of bits doubles the work needed.
Time Complexity: O(n)
This means the time to do bitwise operations grows linearly with the number of bits in the input.
[X] Wrong: "Bitwise operations are instant and take the same time no matter the number size."
[OK] Correct: While hardware is very fast, each bit must be processed, so larger numbers take proportionally more time.
Understanding bitwise operation costs helps you write efficient low-level code and shows you know how computers handle data.
"What if we used 128-bit numbers instead of 32-bit? How would the time complexity change?"
Practice
6 and 3? (6 = 110 in binary, 3 = 011 in binary)Solution
Step 1: Convert numbers to binary
6 in binary is 110, 3 in binary is 011.Step 2: Perform bitwise AND
110 AND 011 = 010 in binary, which is 2 in decimal.Final Answer:
2 -> Option AQuick Check:
6 & 3 = 2 [OK]
- Confusing AND with OR operation
- Not converting numbers to binary before operation
- Mixing decimal and binary values
a and b?Solution
Step 1: Recall Go bitwise operators
In Go, '^' is the bitwise XOR operator.Step 2: Match syntax
c := a ^ b uses '^' correctly for XOR. Other options use logical AND (&&), OR (|), and AND (&).Final Answer:
c := a ^ b -> Option CQuick Check:
Bitwise XOR uses '^' in Go [OK]
- Using '&&' which is logical AND, not bitwise
- Confusing OR '|' with XOR '^'
- Using '&' which is bitwise AND, not XOR
package main
import "fmt"
func main() {
var x uint8 = 12 // binary 00001100
var y uint8 = 5 // binary 00000101
fmt.Println(x | y)
fmt.Println(x & y)
fmt.Println(x ^ y)
}Solution
Step 1: Convert x and y to binary
x = 12 = 00001100, y = 5 = 00000101.Step 2: Calculate bitwise OR, AND, XOR
OR: 00001100 | 00000101 = 00001101 (13 decimal)
AND: 00001100 & 00000101 = 00000100 (4 decimal)
XOR: 00001100 ^ 00000101 = 00001001 (9 decimal)Step 3: Verify output
Output lines are:
13
4
9Final Answer:
13 4 9 -> Option DQuick Check:
Bitwise OR, AND, XOR results match 13, 4, 9 [OK]
- Mixing up OR and XOR results
- Incorrect binary conversion
- Confusing decimal output values
package main
import "fmt"
func main() {
var a int = 3
var b int = 2
var c int = a << b
fmt.Println(c)
}Solution
Step 1: Understand Go shift rules
In Go, shift count must be unsigned integer or untyped constant. Here, b is int but allowed.Step 2: Calculate left shift
3 << 2 means shifting bits of 3 (00000011) left by 2 bits: 00001100 = 12 decimal.Final Answer:
No error, output is 12 -> Option BQuick Check:
3 << 2 = 12 [OK]
- Assuming shift count must be uint explicitly
- Thinking parentheses are required around shift
- Confusing shift operators with arithmetic operators
n, write a Go expression using bitwise operators to toggle (flip) the 3rd bit (counting from 0, right to left) of n. Which expression correctly does this?Solution
Step 1: Understand toggling a bit
Toggling means flipping the bit: if 0 becomes 1, if 1 becomes 0.Step 2: Use XOR to toggle
XOR with 1 flips the bit, XOR with 0 keeps it same. So, n ^ (1 << 3) flips the 3rd bit.Step 3: Check other options
AND keeps bit only if both are 1 (no toggle), OR sets bit to 1 (no toggle), NOT and AND combination does not toggle.Final Answer:
n ^ (1 << 3) -> Option AQuick Check:
XOR with mask toggles bit [OK]
- Using AND or OR which don't toggle bits
- Confusing NOT operator usage
- Incorrect bit position shift
Ready to prove it?
Pass the test and this pattern moves unknown
