Left and right shifts move bits in a number to the left or right. This helps multiply or divide numbers quickly in low-level programming.
Left shift and right shift behavior in Embedded C
result = value << n; // Left shift value by n bits result = value >> n; // Right shift value by n bits
Left shift (<<) moves bits to the left, adding zeros on the right.
Right shift (>>) moves bits to the right. For unsigned values, zeros are added on the left. For signed values, behavior may depend on the compiler (logical vs arithmetic shift).
unsigned int x = 5; // binary 0000 0101 unsigned int y = x << 1; // y = 10 (0000 1010)
unsigned int x = 20; // binary 0001 0100 unsigned int y = x >> 2; // y = 5 (0000 0101)
int x = -8; // binary depends on system int y = x >> 1; // may keep sign bit (arithmetic shift)
This program shows how left and right shifts work on unsigned and signed integers. It prints the original values and the results after shifting.
#include <stdio.h> int main() { unsigned int a = 3; // binary 0000 0011 unsigned int left_shift = a << 2; // shift left by 2 bits unsigned int right_shift = a >> 1; // shift right by 1 bit printf("Original a = %u\n", a); printf("a << 2 = %u\n", left_shift); printf("a >> 1 = %u\n", right_shift); int b = -16; // signed integer int b_right_shift = b >> 2; // right shift signed printf("Original b = %d\n", b); printf("b >> 2 = %d\n", b_right_shift); return 0; }
Left shifting a number by n bits multiplies it by 2^n, but be careful of overflow.
Right shifting unsigned numbers fills with zeros on the left (logical shift).
Right shifting signed numbers may fill with the sign bit (arithmetic shift), preserving the sign.
Left shift (<<) moves bits left, multiplying by powers of two.
Right shift (>>) moves bits right, dividing by powers of two for unsigned numbers.
Signed right shift may keep the sign bit to preserve negative values.
Practice
<< do to an unsigned integer in embedded C?Solution
Step 1: Understand left shift operation
The left shift operator moves bits to the left, adding zeros on the right.Step 2: Effect on unsigned integer value
Shifting left by 1 bit multiplies the number by 2, shifting by n bits multiplies by 2^n.Final Answer:
Multiplies the number by powers of two -> Option CQuick Check:
Left shift = multiply by 2^n [OK]
- Thinking left shift divides the number
- Confusing left shift with bitwise NOT
- Assuming left shift leaves number unchanged
x right by 3 bits in embedded C?Solution
Step 1: Identify right shift operator syntax
In embedded C, right shift is done using>>operator with spaces optional.Step 2: Check options for correct syntax
The correct syntax isx >> 3;using the right shift operator >>, shift amount 3, and semicolon to form a valid statement. Lacking semicolon, using left shift <<, or invalid operator like >>> are incorrect.Final Answer:
x >> 3; -> Option DQuick Check:
Right shift syntax = x >> n; [OK]
- Using >>> which is not valid in C
- Confusing left shift << with right shift >>
- Omitting semicolon at end
unsigned int x = 4;
unsigned int y = x << 2;
printf("%u", y);Solution
Step 1: Understand initial value and shift
Variablexis 4 (binary 100). Left shifting by 2 bits moves bits left twice.Step 2: Calculate shifted value
4 << 2 = 4 * 2^2 = 4 * 4 = 16.Final Answer:
16 -> Option AQuick Check:
4 << 2 = 16 [OK]
- Confusing left shift with right shift
- Calculating 4 << 2 as 8 instead of 16
- Ignoring unsigned type behavior
int x = -16;
int y = x >> 2;
printf("%d", y);What is the likely output assuming arithmetic right shift?
Solution
Step 1: Understand signed right shift behavior
For signed integers, right shift usually preserves the sign bit (arithmetic shift).Step 2: Calculate shifted value
-16 in binary (two's complement) is shifted right by 2 bits, dividing by 4 but keeping sign, so -16 >> 2 = -4.Final Answer:
-4 -> Option AQuick Check:
Signed right shift divides and keeps sign [OK]
- Assuming right shift always fills with zeros
- Confusing signed and unsigned shift results
- Expecting positive result from negative input
val by 8 using bit shifts without overflow. Which code snippet is correct?unsigned char val = 20; unsigned char result = val << 3;
What should you check before shifting to avoid overflow?
Solution
Step 1: Understand shift and overflow risk
Shifting left by 3 multiplies by 8. For 8-bit unsigned, max value is 255.Step 2: Calculate max safe value
To avoid overflow: val * 8 <= 255 -> val <= 31.875, so val must be ≤ 31.Final Answer:
Ensure val <= 31 before shifting -> Option BQuick Check:
Max val before shift = 255 / 8 = 31 [OK]
- Ignoring overflow risk on left shift
- Assuming shifting never causes overflow
- Using wrong max value for 8-bit unsigned
Ready to prove it?
Pass the test and this pattern moves unknown
