In C, there are two operators for shifting bits:
<<
is left shift>>
is right shifts = a >> b;
We can see in the example above that these operators accept two operands,
so they are binary operators. The first operand (a
) is the variable to shift.
The second operand is the number of bits of the shift. If b
is 2, the variable a
will be
shifted by two bits to the right.
Consider the following example:
unsigned char a= 0x3C;
printf ("a << 1 = %d\n", a<<1 );
To simulate the result of this operator, it is necessary to follow the same method as
for bitwise operators. Let's start by converting the variable a
into
binary :
$$ (3C)_{16} = (0011\:1100)_2 $$
Now, let's shift the binary word to the left by 1 bit:
$$ (0011\:1100)_2 << 1 = (0111\:1000)_2 $$
Note that the shift is not a circular permutation, the left bit (high order) does not return to the right bit. Here, the left bit is lost. With a left shift, the low-order bit (right-hand bit) is always replaced by a zero.
It is now enough to convert this result in base 10 to obtain the display of the program:
$$ (0111\:1000)_2 = (120)_{10} $$
Let's check this result:
Let's consider the following example:
unsigned char a= 0x3C;
printf ("a >> 3 = %d\n", a>>3 );
The conversion of the variable a
to binary is identical to the previous example.
$$ (3C)_{16} = (0011\:1100)_2 $$
The general scheme of the shift is represented by:
$$ (0011\:1100)_2 >> 3 = (0000\:0111)_2 = (7)_{10}$$
Let's check this result:
A binary shift is the same as a multiplication or division. When we shift to the left, we multiply by two:
a << 1
is equivalent to \( 2 \times a \)a << 2
is equivalent to \( 4 \times a \)a << 3
is equivalent to \( 8 \times a \)a << 4
is equivalent to \( 16 \times a \)a << n
is equivalent to \( 2^n \times a \)For right-hand shifts, if we omit the decimal part of the result, we can also consider that :
a >> n
is equivalent to \( \dfrac{a}{2^n} \)To guarantee equivalence between these multiplications and the shifts, the bit that is entered in the binary word is always a zero, unless the variable is negative.
As shifts are generally only used on unsigned
, remember that in this case, zeros are always inserted.
Complete the following program to perform two operations:
a
;a
.The results will be assigned to the variables shift
and mult
respectively.
#include <stdio.h>
int main(void) {
unsigned char a=0x12;
unsigned char mult, shift;
// shift = a shifted 3 bits to the left
// COMPLETE HERE
// mult = a multiplied by 8
// COMPLETE HERE
// Display the results
printf ("a << 3 = %d\n", shift);
printf ("a * 8 = %d\n", mult);
return 0;
}
What does the following program display?
unsigned char a=3;
printf ("%d", a << 1 );
What does the following program display?
unsigned char a=3;
printf ("%d", a >> 1 );
What does the following program display?
unsigned char a=0x0F;
printf ("%d", a << 4 );
What does the following program display?
unsigned char a=0x0F;
printf ("%d", a >> 4 );
Without converting to binary, find what the following program displays.
unsigned char a=1;
printf ("%d", a << 5 );
Without converting to binary, find what the following program displays.
unsigned char a=26;
printf ("%d", a >> 2 );
Without converting to binary, find what the following program displays.
unsigned int a=0xA4D912AB;
printf ("%X", a << 4 );