Left and right shifts move bits to multiply or divide unsigned values by powers of two.

left shift `value << n` moves bits left and multiplies by `2^n` for these small unsigned values.
right shift `value >> n` moves bits right and divides by `2^n` for these small unsigned values.

Shift Values

value
shift_values.c
Replay: real traced execution (multi-file project)
#include <stdio.h>

int main(void) {
    unsigned int value = 3;
    unsigned int doubled = value << 1;
    unsigned int halved = doubled >> 1;

    printf("doubled=%u halved=%u\n", doubled, halved);
    return 0;
}
#include <stdio.h>

int main(void) {
    unsigned int value = 5;
    unsigned int doubled = value << 1;
    unsigned int halved = doubled >> 1;

    printf("doubled=%u halved=%u\n", doubled, halved);
    return 0;
}
#include <stdio.h>

int main(void) {
    unsigned int value = 8;
    unsigned int doubled = value << 1;
    unsigned int halved = doubled >> 1;

    printf("doubled=%u halved=%u\n", doubled, halved);
    return 0;
}
  1. value ← 3, doubled ← 6, halved ← 3

    3int main(void) {4    unsigned int value→ 3 = 3; //@value=5, 85    unsigned int doubled→ 6 = value3 << 1;6    unsigned int halved→ 3 = doubled6 >> 1;78    printf("doubled=%u halved=%u\n", doubled6, halved3);9    return 0;10}
    outputdoubled=6 halved=3
  1. value ← 5, doubled ← 10, halved ← 5

    3int main(void) {4    unsigned int value→ 5 = 5;5    unsigned int doubled→ 10 = value5 << 1;6    unsigned int halved→ 5 = doubled10 >> 1;78    printf("doubled=%u halved=%u\n", doubled10, halved5);9    return 0;10}
    outputdoubled=10 halved=5
  1. value ← 8, doubled ← 16, halved ← 8

    3int main(void) {4    unsigned int value→ 8 = 8;5    unsigned int doubled→ 16 = value8 << 1;6    unsigned int halved→ 8 = doubled16 >> 1;78    printf("doubled=%u halved=%u\n", doubled16, halved8);9    return 0;10}
    outputdoubled=16 halved=8