El >> tiene truco
Existe dos tipos de desplazamiento, el logico y el aritmetico.
Cuando el desplazamiento es hacia la izquierda (<<), ambos son equivalentes, pero cuando es hacia la derecha (>>), actuan de forma diferente : el logico es desplazar bits hacia la derecha añadiendo ceros por la izquierda, pero el aritmetico, lo que hace es replicar el bit de signo (es decir, el mas alto) para ir rellenando desde la izquierda.
Esto en C se traduce en que si la variable es con signo (un int, por ejemplo), el desplazamiento será aritmetico, pero si es sin signo, entonces si será logico.
Unos ejemplos sencillos usando variables de tamaño de un byte:
signed char a=-128;
a>>=2; En binario: 10000000b >>2 =11100000b = -32 en dec
unsigned char a=128;
a>>=2; En binario: 10000000b >>2 =00100000b = 32 en dec
Asi que ya sabes: cuidado con los desplazamientos hacia la derecha