📖 Scenario: You are working with a simple embedded system that controls lights. Each light is represented by a bit in an integer variable. You want to learn how to turn lights on and off using bit manipulation.
🎯 Goal: Build a small C program that uses bit manipulation to turn on, turn off, and check the status of specific lights represented by bits in an integer.
📋 What You'll Learn
Create an integer variable called lights with initial value 0
Create an integer variable called light_to_control with value 2
Use bitwise OR to turn on the light at position light_to_control in lights
Use bitwise AND with NOT to turn off the light at position light_to_control in lights
Use bitwise AND to check if the light at position light_to_control is on
Print the status of lights after each operation
💡 Why This Matters
🌍 Real World
Bit manipulation is used in embedded systems, device drivers, and performance-critical code to control hardware or flags efficiently.
💼 Career
Understanding bit manipulation helps in jobs involving low-level programming, embedded software, and systems programming.
Progress0 / 4 steps
1
Create the initial lights variable
Create an integer variable called lights and set it to 0 to represent all lights off.
C
Hint
Use int lights = 0; to start with all lights off.
2
Set the light to control
Create an integer variable called light_to_control and set it to 2 to represent the third light (bit position 2).
C
Hint
Remember bit positions start at 0, so 2 means the third light.
3
Turn on the light using bitwise OR
Use bitwise OR to turn on the light at position light_to_control in lights. Write the code: lights = lights | (1 << light_to_control);
C
Hint
Use 1 << light_to_control to create a mask for the bit to turn on.
4
Turn off the light and check status
Turn off the light at position light_to_control using bitwise AND with NOT: lights = lights & ~(1 << light_to_control); Then check if the light is on using bitwise AND and print "Light is on" or "Light is off" accordingly.
C
Hint
Use ~(1 << light_to_control) to create a mask to turn off the bit.
Use if (lights & (1 << light_to_control)) to check if the bit is on.
Practice
(1/5)
1. What does the bitwise AND operator & do when applied between two bits?
easy
A. Returns 1 if either bit is 1
B. Returns 0 always
C. Flips the bits
D. Returns 1 only if both bits are 1
Solution
Step 1: Understand bitwise AND operation
The bitwise AND operator compares each bit of two numbers and returns 1 only if both bits are 1.
Step 2: Apply to bits
For example, 1 & 1 = 1, but 1 & 0 = 0 and 0 & 0 = 0.
Final Answer:
Returns 1 only if both bits are 1 -> Option D
Quick Check:
AND = 1 if both bits 1 [OK]
Hint: AND returns 1 only when both bits are 1 [OK]
Common Mistakes:
Confusing AND with OR operator
Thinking AND flips bits
Assuming AND always returns 1
2. Which of the following is the correct syntax to set the 3rd bit (0-indexed) of an unsigned int variable num in C?
easy
A. num = num | (1 << 3);
B. num = num & (1 << 3);
C. num = num ^ (1 << 3);
D. num = num << 3;
Solution
Step 1: Understand setting a bit
To set a bit means to make it 1 without changing other bits. We use OR with a mask that has 1 at the target bit.
Step 2: Use bit shift and OR
The mask is created by shifting 1 left by 3 (1 << 3). OR-ing num with this mask sets the 3rd bit.
Final Answer:
num = num | (1 << 3); -> Option A
Quick Check:
Set bit = OR with shifted 1 [OK]
Hint: Use OR with (1 << bit_position) to set a bit [OK]
Common Mistakes:
Using AND instead of OR to set bits
Using XOR which toggles bits
Shifting num instead of 1
3. What is the output of the following C code?
unsigned int x = 5; // binary 0101
x = x ^ (1 << 2);
printf("%u", x);
medium
A. 4
B. 1
C. 5
D. 7
Solution
Step 1: Understand initial value and mask
x = 5 in binary is 0101. The mask is (1 << 2) = 0100 (decimal 4).
Step 2: Apply XOR operation
XOR toggles bits where mask has 1. 0101 ^ 0100 = 1101 (decimal 7). Let's do bitwise XOR: Bits (3 2 1 0): 5 = 0 1 0 1 Mask = 0 1 0 0 XOR = 0 0 0 1 is incorrect. Actually, bits are: Bit 3: 0 ^ 0 = 0 Bit 2: 1 ^ 1 = 0 Bit 1: 0 ^ 0 = 0 Bit 0: 1 ^ 0 = 1 Result: 0001 (decimal 1) is incorrect for toggling bit 2. Wait, bit 2 is the third bit from right (0-indexed). So bits are: Bit 0: least significant bit Bit 1: next Bit 2: next So 5 (0101) bits: Bit 3: 0 Bit 2: 1 Bit 1: 0 Bit 0: 1 XOR with mask 0100: Bit 3: 0 ^ 0 = 0 Bit 2: 1 ^ 1 = 0 Bit 1: 0 ^ 0 = 0 Bit 0: 1 ^ 0 = 1 Result: 0001 (decimal 1). So output is 1. Therefore, correct answer is 1 -> 1.
Final Answer:
1 -> Option B
Quick Check:
XOR toggles bit 2: 5 ^ 4 = 1 [OK]
Hint: XOR toggles bits where mask is 1 [OK]
Common Mistakes:
Miscounting bit positions (0-indexed from right)
Confusing XOR with OR or AND
Incorrect binary to decimal conversion
4. Identify the error in this C code snippet that tries to clear the 1st bit of num:
unsigned int num = 14; // binary 1110
num = num & (1 << 1);
printf("%u", num);
medium
A. Mask should be inverted before AND
B. Should use OR instead of AND
C. Bit shift is incorrect, should be (1 << 0)
D. No error, code is correct
Solution
Step 1: Understand clearing a bit
To clear a bit, we AND with a mask that has 0 at the target bit and 1s elsewhere.
Step 2: Analyze given mask
The mask (1 << 1) is 00010 (binary), which has 1 only at bit 1. AND-ing num with this mask keeps only bit 1 and clears others, not what we want.
Step 3: Correct mask usage
We should invert the mask: ~ (1 << 1), so bit 1 is 0 and others 1, then AND with num to clear bit 1.
Final Answer:
Mask should be inverted before AND -> Option A
Quick Check:
Clear bit = AND with inverted mask [OK]
Hint: Clear bit by AND with ~(1 << bit_position) [OK]
Common Mistakes:
Using mask without inversion to clear bits
Using OR instead of AND to clear bits
Confusing bit positions
5. You want to check if the 4th bit (0-indexed) of an unsigned int flags is set (1). Which code snippet correctly does this and prints "Set" if true, otherwise "Not set"?
hard
A. if ((flags ^ (1 << 4)) == 1) printf("Set"); else printf("Not set");
B. if ((flags | (1 << 4)) == 0) printf("Set"); else printf("Not set");
C. if ((flags & (1 << 4)) != 0) printf("Set"); else printf("Not set");
D. if ((flags & (1 << 3)) != 0) printf("Set"); else printf("Not set");
Solution
Step 1: Understand checking a bit
To check if a bit is set, AND the number with a mask having 1 at that bit. If result is not zero, bit is set.
Step 2: Analyze options
if ((flags & (1 << 4)) != 0) printf("Set"); else printf("Not set"); uses (flags & (1 << 4)) != 0 which correctly checks the 4th bit. if ((flags | (1 << 4)) == 0) printf("Set"); else printf("Not set"); uses OR and compares to zero, which is incorrect. if ((flags ^ (1 << 4)) == 1) printf("Set"); else printf("Not set"); uses XOR and compares to 1, which is incorrect. if ((flags & (1 << 3)) != 0) printf("Set"); else printf("Not set"); checks bit 3 instead of 4, so wrong bit.
Final Answer:
if ((flags & (1 << 4)) != 0) printf("Set"); else printf("Not set"); -> Option C
Quick Check:
Check bit = AND with mask != 0 [OK]
Hint: Check bit with AND and compare to zero [OK]
Common Mistakes:
Using OR or XOR to check bits
Checking wrong bit position
Comparing AND result incorrectly
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.