Checking if a bit is set in Embedded C - Time & Space Complexity
We want to understand how the time to check a bit changes as the input changes.
Specifically, how long does it take to find out if a certain bit is set in a number?
Analyze the time complexity of the following code snippet.
unsigned int isBitSet(unsigned int num, unsigned int pos) {
return (num & (1U << pos)) != 0;
}
This code checks if the bit at position pos in num is set (1) or not (0).
Identify the loops, recursion, array traversals that repeat.
- Primary operation: A single bitwise AND and shift operation.
- How many times: Exactly once per function call.
The time to check a bit does not grow with the size of the number or the bit position.
| Input Size (bit position) | Approx. Operations |
|---|---|
| 10 | 1 |
| 100 | 1 |
| 1000 | 1 |
Pattern observation: The operation count stays the same no matter the input size.
Time Complexity: O(1)
This means the time to check a bit is constant and does not depend on the input size.
[X] Wrong: "Checking a bit takes longer if the bit position is higher."
[OK] Correct: Bitwise operations run in constant time regardless of which bit is checked.
Knowing that bit checks are constant time helps you write efficient low-level code and answer questions confidently.
"What if we checked multiple bits one by one in a loop? How would the time complexity change?"
Practice
(num & (1 << 3)) != 0 check in embedded C?Solution
Step 1: Understand the bit shift operation
The expression1 << 3shifts 1 left by 3 bits, creating a mask with only the 4th bit set (value 8).Step 2: Apply bitwise AND to check the bit
The bitwise ANDnum & (1 << 3)isolates the 4th bit ofnum. If this result is not zero, the bit is set.Final Answer:
Checks if the 4th bit (bit 3) of num is set to 1 -> Option BQuick Check:
Bitwise AND with mask = non-zero means bit set [OK]
- Confusing bit position with bit value
- Forgetting bits start at 0
- Using OR instead of AND to check bits
x is set in embedded C?Solution
Step 1: Identify the mask for bit 1
The mask for the 2nd bit is1 << 1, which equals 2.Step 2: Use bitwise AND to check the bit
Usingx & (1 << 1)checks if bit 1 is set. If the result is non-zero, the bit is set.Final Answer:
if (x & (1 << 1)) { /* bit is set */ } -> Option DQuick Check:
Bitwise AND with shifted 1 checks bit [OK]
- Using bitwise OR (|) instead of AND (&)
- Using left shift on variable instead of mask
- Checking wrong bit position
unsigned int num = 13; // binary 1101
if (num & (1 << 2))
printf("Bit 2 is set\n");
else
printf("Bit 2 is not set\n");Solution
Step 1: Convert num to binary and identify bit 2
Number 13 in binary is 1101. Bits are numbered from 0 (rightmost). Bit 2 is the third bit from right, which is 1.Step 2: Check bit 2 using bitwise AND
The expressionnum & (1 << 2)equals13 & 4which is 4 (non-zero), so the condition is true.Final Answer:
Bit 2 is set -> Option CQuick Check:
Bit 2 in 1101 is 1, so output is "Bit 2 is set" [OK]
- Miscounting bit positions starting at 1 instead of 0
- Assuming bit 2 is zero without checking
- Confusing bitwise AND with OR
flags is set. What is the error?
unsigned int flags = 0x20;
if (flags & 5 << 1) {
// bit is set
}Solution
Step 1: Analyze operator precedence in expression
The expressionflags & 5 << 1is evaluated asflags & (5 << 1)due to operator precedence (<< higher than &).Step 2: Understand the intended mask and fix
The intended mask is1 << 5to check bit 5. The current expression does not create the correct mask.Final Answer:
Incorrect operator precedence causes wrong mask -> Option AQuick Check:
Use parentheses: flags & (1 << 5) to fix [OK]
- Not using parentheses causing wrong evaluation
- Shifting wrong constant (5 instead of 1)
- Confusing bit positions and mask values
status. Write a condition to check if either bit 1 or bit 3 is set. Which of the following is correct?Solution
Step 1: Create mask for bits 1 and 3
Use bitwise OR to combine masks:(1 << 1) | (1 << 3)creates a mask with bits 1 and 3 set.Step 2: Use bitwise AND to check if either bit is set
Check ifstatus & maskis non-zero to confirm if either bit is set.Final Answer:
if (status & ((1 << 1) | (1 << 3))) { /* bit 1 or 3 set */ } -> Option AQuick Check:
Combine masks with |, check with & for any bit set [OK]
- Using && instead of | to combine masks
- Using + instead of | causing wrong mask
- Using bitwise OR on variable instead of mask
Ready to prove it?
Pass the test and this pattern moves unknown
