Why bitwise operations are essential in embedded in Embedded C - Performance Analysis
Bitwise operations are very common in embedded programming because they work directly with bits, the smallest data units.
We want to understand how the time to run bitwise operations changes as input size grows.
Analyze the time complexity of the following code snippet.
unsigned int set_bit(unsigned int num, int pos) {
return num | (1U << pos);
}
unsigned int clear_bit(unsigned int num, int pos) {
return num & ~(1U << pos);
}
unsigned int toggle_bit(unsigned int num, int pos) {
return num ^ (1U << pos);
}
This code sets, clears, or toggles a single bit in an integer using bitwise operations.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Single bitwise operation per function call.
- How many times: Each function runs a fixed number of steps regardless of input size.
Each bitwise operation works on fixed-size data (like 32 bits), so the time does not grow with input size.
| Input Size (bits) | Approx. Operations |
|---|---|
| 8 | 3 |
| 16 | 3 |
| 32 | 3 |
Pattern observation: The number of operations stays the same no matter how many bits the number has.
Time Complexity: O(1)
This means the time to perform bitwise operations is constant and does not increase with input size.
[X] Wrong: "Bitwise operations take longer as the number gets bigger because there are more bits to handle."
[OK] Correct: Bitwise operations work on fixed-size registers, so they take the same time regardless of the number's size.
Understanding that bitwise operations run in constant time helps you write efficient embedded code and answer questions about low-level performance.
"What if we used a loop to set multiple bits one by one? How would the time complexity change?"
Practice
Solution
Step 1: Understand embedded system needs
Embedded systems often interact directly with hardware registers where each bit controls a specific function.Step 2: Role of bitwise operations
Bitwise operations let programmers set, clear, or check these individual bits efficiently without affecting others.Final Answer:
They allow direct control of individual hardware bits efficiently. -> Option AQuick Check:
Bitwise = hardware bit control [OK]
- Thinking bitwise operations are for UI design
- Assuming bitwise auto-optimizes memory
- Confusing bitwise with arithmetic operations
flags in embedded C?Solution
Step 1: Identify bit position and operation
The 3rd bit means bit index 2 (counting from 0). To set a bit, use OR with 1 shifted left by that bit index.Step 2: Check each option
flags = flags | (1 << 2); correctly uses OR and shifts 1 by 2. flags = flags & (1 << 3); uses AND which clears bits, flags = flags ^ (1 << 3); toggles bit, flags = flags << 3; shifts the whole variable.Final Answer:
flags = flags | (1 << 2); -> Option AQuick Check:
Set bit = OR with 1<
- Using AND instead of OR to set bits
- Confusing bit index counting from 1 instead of 0
- Using XOR which toggles instead of sets
unsigned char flags = 0b00001010;
flags = flags & ~(1 << 3);
printf("%u", flags);Solution
Step 1: Analyze initial value and bit to clear
flags starts as binary 00001010 (decimal 10). Bit 3 (zero-based) is the 4th bit from right, which is currently 1.Step 2: Apply bitwise AND with negated mask
Mask is (1 << 3) = 00001000. Negated mask is 11110111. ANDing clears bit 3: 00001010 & 11110111 = 00000010 (decimal 2).Final Answer:
2 -> Option CQuick Check:
Clear bit 3 = 2 [OK]
- Forgetting to negate mask before AND
- Miscounting bit positions starting at 1
- Assuming XOR clears bits
status:unsigned int status = 0x01; status = status & (1 << 0);
Solution
Step 1: Understand toggling operation
Toggling a bit means flipping it: 0 to 1 or 1 to 0. This is done using XOR with 1 at that bit position.Step 2: Analyze given code
The code uses AND with (1 << 0), which clears all bits except bit 0, not toggling it.Final Answer:
Using AND instead of XOR to toggle the bit. -> Option DQuick Check:
Toggle bit = XOR with 1<
- Using AND or OR instead of XOR to toggle
- Confusing bit positions starting at 1
- Assuming toggling clears bits
reg where bits 0-3 represent sensor states. Write a bitwise expression to check if sensors 1 and 3 (bits 0 and 2) are both ON (set to 1). Which expression correctly returns true if both are ON?Solution
Step 1: Identify bits to check
Bits 0 and 2 correspond to sensors 1 and 3. We want to confirm both bits are set to 1.Step 2: Understand bitwise check for multiple bits
Using AND with mask of bits 0 and 2, then comparing result to mask ensures both bits are ON.Step 3: Evaluate options
(reg & ((1 << 0) | (1 << 2))) == ((1 << 0) | (1 << 2)) correctly uses AND with mask and compares to mask. (reg | ((1 << 0) & (1 << 2))) == ((1 << 0) & (1 << 2)) misuses OR and AND. (reg & (1 << 1)) && (reg & (1 << 3)) checks wrong bits (1 and 3). (reg ^ ((1 << 0) | (1 << 2))) == 0 uses XOR which is incorrect for this check.Final Answer:
(reg & ((1 << 0) | (1 << 2))) == ((1 << 0) | (1 << 2)) -> Option BQuick Check:
Check bits ON = AND mask == mask [OK]
- Using OR instead of AND for checking bits
- Checking wrong bit positions
- Using XOR which does not confirm both bits set
Ready to prove it?
Pass the test and this pattern moves unknown
