Here’s the Wikipedia entry for C’s bit operations:
Half way down they talk about bit shifting.
Here’s a simple example:
unsigned char x=1;
unsigned char y = x << 1;
The binary representation of x is 0000 0001. Doing 1 bit shift to the left gets you 0000 0010. So y==2.
For every bit shift operation, all the binary digits get shifted one position to the left. In effect, you are multiplying by 2, until you run out of bits. Any bit at the top gets lost in the bit shift.
It’s one of those old-school C optimizations. Back in the day shift operations where much faster (1 cycle) than multiple operations (O(# bits), I think).
But these days, who the heck cares? And it makes the code harder to understand if you’re not familiar with these things.