Bird
Raised Fist0
Embedded Cprogramming~20 mins

Setting a specific bit in a register in Embedded C - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Bitwise Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
What is the value of the register after setting bit 3?

Given a register initially set to 0x00, what will be its value after setting bit 3 using the code below?

Embedded C
unsigned char reg = 0x00;
reg |= (1 << 3);
printf("0x%02X", reg);
A0x08
B0x03
C0x10
D0x80
Attempts:
2 left
💡 Hint

Remember that bits are zero-indexed from the right, starting at 0.

❓ Predict Output
intermediate
2:00remaining
What does this code print after setting bit 0 and bit 7?

Consider the following code snippet. What is printed?

Embedded C
unsigned char reg = 0x00;
reg |= (1 << 0);
reg |= (1 << 7);
printf("0x%02X", reg);
A0x80
B0x01
C0x81
D0xFF
Attempts:
2 left
💡 Hint

Bit 0 is the least significant bit, bit 7 is the most significant bit in an 8-bit register.

🔧 Debug
advanced
2:00remaining
Identify the error in setting bit 5

What error does this code produce when trying to set bit 5 of the register?

Embedded C
unsigned char reg = 0x00;
reg = reg | 1 << 5;
printf("0x%02X", reg);
ANo error, prints 0x20
BSyntax error due to missing parentheses
CRuntime error due to operator precedence
DPrints 0x01 instead of 0x20
Attempts:
2 left
💡 Hint

Check operator precedence of bitwise OR and shift operators.

📝 Syntax
advanced
2:00remaining
Which option correctly sets bit 4 without affecting other bits?

Choose the code snippet that sets bit 4 of reg without changing other bits.

Embedded C
unsigned char reg = 0x12; // initial value
Areg |= 1 << 5;
Breg = reg & (1 << 4);
Creg = (1 << 4);
Dreg = reg | (1 << 4);
Attempts:
2 left
💡 Hint

Use bitwise OR to set a bit without clearing others.

🚀 Application
expert
3:00remaining
How many bits are set after this code runs?

Given the code below, how many bits are set to 1 in reg after execution?

Embedded C
unsigned char reg = 0x00;
for (int i = 0; i < 8; i += 2) {
    reg |= (1 << i);
}
printf("%d", __builtin_popcount(reg));
A5
B4
C8
D3
Attempts:
2 left
💡 Hint

Bits set are at positions 0, 2, 4, 6.

Practice

(1/5)
1. What does the expression REGISTER |= (1 << 3); do in embedded C?
easy
A. Clears the 3rd bit (bit position 2) of REGISTER to 0
B. Sets the 4th bit (bit position 3) of REGISTER to 1 without changing other bits
C. Toggles all bits of REGISTER
D. Resets REGISTER to zero

Solution

  1. Step 1: Understand bit shifting

    The expression 1 << 3 shifts the number 1 three places to the left, resulting in binary 00001000, which targets bit position 3.
  2. Step 2: Apply bitwise OR to set bit

    Using |= with this mask sets bit 3 to 1 in REGISTER without changing other bits.
  3. Final Answer:

    Sets the 4th bit (bit position 3) of REGISTER to 1 without changing other bits -> Option B
  4. Quick Check:

    Bit shift + OR sets specific bit = A [OK]
Hint: Use |= with (1 << bit) to set that bit only [OK]
Common Mistakes:
  • Confusing bit positions starting from 1 instead of 0
  • Using & instead of | to set bits
  • Thinking it clears bits instead of setting
2. Which of the following is the correct syntax to set bit 5 of a register named PORTA?
easy
A. PORTA = 1 << 5;
B. PORTA ^= (1 << 5);
C. PORTA &= ~(1 << 5);
D. PORTA |= (1 << 5);

Solution

  1. Step 1: Identify correct operator to set bit

    To set a bit without affecting others, use bitwise OR assignment |= with a mask.
  2. Step 2: Check the bit mask and syntax

    1 << 5 creates a mask for bit 5. Combining with |= sets that bit.
  3. Final Answer:

    PORTA |= (1 << 5); -> Option D
  4. Quick Check:

    Use |= with shifted 1 to set bit [OK]
Hint: Use |= with (1 << bit) to set bit correctly [OK]
Common Mistakes:
  • Using = instead of |= overwrites all bits
  • Using &= ~ to clear bits, not set
  • Using ^= toggles bits instead of setting
3. Given unsigned char REG = 0x12; (binary 00010010), what is the value of REG after executing REG |= (1 << 4);?
medium
A. 0x32
B. 0x12
C. 0x16
D. 0x10

Solution

  1. Step 1: Convert initial REG value to binary

    0x12 in binary is 00010010. Bit positions (0 to 7) from right to left.
  2. Step 2: Calculate mask and apply OR

    1 << 4 is 00010000 (bit 4 set). OR with 00010010 results in 00110010 (0x32).
  3. Final Answer:

    0x32 -> Option A
  4. Quick Check:

    0x12 | 0x10 = 0x32 [OK]
Hint: Convert hex to binary, OR with mask, convert back [OK]
Common Mistakes:
  • Miscounting bit positions starting from 1
  • Confusing hex and decimal values
  • Using &= or ^= instead of |=
4. Identify the error in the following code snippet intended to set bit 2 of REG:
unsigned char REG = 0x00;
REG = REG & (1 << 2);
medium
A. Using & instead of | clears all bits except bit 2
B. Bit shift operator << is used incorrectly
C. REG should be declared as int, not unsigned char
D. No error, code correctly sets bit 2

Solution

  1. Step 1: Analyze bitwise AND usage

    The code uses & with mask (1 << 2), which clears all bits except bit 2.
  2. Step 2: Understand effect on REG

    Since REG starts at 0, AND with mask results in 0, not setting bit 2. To set bit 2, OR |= should be used.
  3. Final Answer:

    Using & instead of | clears all bits except bit 2 -> Option A
  4. Quick Check:

    Use |= to set bits, & clears bits [OK]
Hint: Use |= to set bits, & clears bits [OK]
Common Mistakes:
  • Confusing & and | operators
  • Assuming &= sets bits
  • Ignoring initial value of REG
5. You have a 16-bit register REG16 initially set to 0x0000. Write the correct statement to set bits 0, 7, and 15 simultaneously without affecting other bits.
hard
A. REG16 = (1 << 0) | (1 << 7) | (1 << 15);
B. REG16 = (1 << 0) & (1 << 7) & (1 << 15);
C. REG16 |= (1 << 0) | (1 << 7) | (1 << 15);
D. REG16 |= (1 << 0) & (1 << 7) & (1 << 15);

Solution

  1. Step 1: Create mask for bits 0, 7, and 15

    Use bitwise OR to combine masks: (1 << 0) | (1 << 7) | (1 << 15) sets bits 0, 7, and 15.
  2. Step 2: Use |= to set bits without clearing others

    Using |= applies the mask to REG16, setting those bits while preserving others.
  3. Final Answer:

    REG16 |= (1 << 0) | (1 << 7) | (1 << 15); -> Option C
  4. Quick Check:

    Combine masks with | and set with |= [OK]
Hint: Combine bit masks with | and set with |= [OK]
Common Mistakes:
  • Using & instead of | to combine masks
  • Using = overwrites all bits, losing previous data
  • Using & instead of | in assignment
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard