📖 Scenario: You are working with a microcontroller and need to check if a specific bit in a status register is set. This is common when reading hardware flags.
🎯 Goal: Build a small program that checks if the 3rd bit (bit number 2, counting from 0) in a byte variable called status_register is set (1) or not (0).
📋 What You'll Learn
Create a variable status_register with the exact value 0b00001100.
Create a variable bit_to_check with the exact value 2.
Use a bitwise operation to check if the bit at position bit_to_check in status_register is set.
Print "Bit is set" if the bit is 1, otherwise print "Bit is not set".
💡 Why This Matters
🌍 Real World
Checking bits in registers is essential in embedded systems to read hardware status flags, control bits, or error indicators.
💼 Career
Embedded software engineers often need to manipulate and check bits directly to interface with hardware devices.
Progress0 / 4 steps
1
Create the status register variable
Create an unsigned char variable called status_register and set it to the binary value 0b00001100.
Embedded C
Hint
Use unsigned char status_register = 0b00001100; to create the variable.
2
Create the bit position variable
Create an int variable called bit_to_check and set it to 2.
Embedded C
Hint
Use int bit_to_check = 2; to create the variable.
3
Check if the bit is set
Create an int variable called bit_is_set that stores the result of checking if the bit at position bit_to_check in status_register is set. Use the bitwise AND operator and a left shift.
Embedded C
Hint
Use bit_is_set = status_register & (1 << bit_to_check); to check the bit.
4
Print the result
Write an if statement that prints "Bit is set" if bit_is_set is not zero, otherwise print "Bit is not set".
Embedded C
Hint
Use if (bit_is_set) { printf("Bit is set\n"); } else { printf("Bit is not set\n"); }
Practice
(1/5)
1. What does the expression (num & (1 << 3)) != 0 check in embedded C?
easy
A. If the 1st bit (bit 0) of num is set to 1
B. If the 4th bit (bit 3) of num is set to 1
C. If num is equal to 8
D. If num is an even number
Solution
Step 1: Understand the bit shift operation
The expression 1 << 3 shifts 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 AND num & (1 << 3) isolates the 4th bit of num. 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 B
Quick Check:
Bitwise AND with mask = non-zero means bit set [OK]
Hint: Use (1 << bit) & num to check bit set quickly [OK]
Common Mistakes:
Confusing bit position with bit value
Forgetting bits start at 0
Using OR instead of AND to check bits
2. Which of the following is the correct syntax to check if the 2nd bit (bit 1) of variable x is set in embedded C?
easy
A. if (x & 1) { /* bit is set */ }
B. if (x | (1 << 1)) { /* bit is set */ }
C. if (x << 1) { /* bit is set */ }
D. if (x & (1 << 1)) { /* bit is set */ }
Solution
Step 1: Identify the mask for bit 1
The mask for the 2nd bit is 1 << 1, which equals 2.
Step 2: Use bitwise AND to check the bit
Using x & (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 D
Quick Check:
Bitwise AND with shifted 1 checks bit [OK]
Hint: Use & with (1 << bit) to check bits, not | or << alone [OK]
Common Mistakes:
Using bitwise OR (|) instead of AND (&)
Using left shift on variable instead of mask
Checking wrong bit position
3. What is the output of the following code snippet?
unsigned int num = 13; // binary 1101
if (num & (1 << 2))
printf("Bit 2 is set\n");
else
printf("Bit 2 is not set\n");
medium
A. Compilation error
B. Bit 2 is not set
C. Bit 2 is set
D. No output
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 expression num & (1 << 2) equals 13 & 4 which is 4 (non-zero), so the condition is true.
Final Answer:
Bit 2 is set -> Option C
Quick Check:
Bit 2 in 1101 is 1, so output is "Bit 2 is set" [OK]
Hint: Convert number to binary, check bit position with mask [OK]
Common Mistakes:
Miscounting bit positions starting at 1 instead of 0
Assuming bit 2 is zero without checking
Confusing bitwise AND with OR
4. The following code is intended to check if bit 5 of flags is set. What is the error?
unsigned int flags = 0x20;
if (flags & 5 << 1) {
// bit is set
}
medium
A. Incorrect operator precedence causes wrong mask
B. Bit shift should be on variable, not constant
C. Missing parentheses around bit shift
D. Using bitwise OR instead of AND
Solution
Step 1: Analyze operator precedence in expression
The expression flags & 5 << 1 is evaluated as flags & (5 << 1) due to operator precedence (<< higher than &).
Step 2: Understand the intended mask and fix
The intended mask is 1 << 5 to check bit 5. The current expression does not create the correct mask.
Final Answer:
Incorrect operator precedence causes wrong mask -> Option A
Quick Check:
Use parentheses: flags & (1 << 5) to fix [OK]
Hint: Always use parentheses around (1 << bit) mask [OK]
Common Mistakes:
Not using parentheses causing wrong evaluation
Shifting wrong constant (5 instead of 1)
Confusing bit positions and mask values
5. You have an 8-bit status register status. Write a condition to check if either bit 1 or bit 3 is set. Which of the following is correct?
hard
A. if (status & ((1 << 1) | (1 << 3))) { /* bit 1 or 3 set */ }
B. if ((status & (1 << 1)) && (status & (1 << 3))) { /* bit 1 or 3 set */ }
C. if (status | (1 << 1) | (1 << 3)) { /* bit 1 or 3 set */ }
D. if (status & (1 << (1 + 3))) { /* bit 1 or 3 set */ }
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 if status & mask is non-zero to confirm if either bit is set.
Final Answer:
if (status & ((1 << 1) | (1 << 3))) { /* bit 1 or 3 set */ } -> Option A
Quick Check:
Combine masks with |, check with & for any bit set [OK]
Hint: Combine bit masks with | inside parentheses before & [OK]
Common Mistakes:
Using && instead of | to combine masks
Using + instead of | causing wrong mask
Using bitwise OR on variable instead of mask
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.