En Java hay 3 operadores de desplazamiento de bits:
1) El operador <<, que desplaza todos los bits hacia la izquierda tantas posiciones como sea indicado, dejando a la derecha valores nulos. Los bits no nulos que no quepan serán perdidos, y si hay una conservación del signo, equivale a multiplicar por 2 elevado al número de bits desplazados. Es decir:
Equivale a hacer:
Porque 2^5 = 32. Pero:
Equivale a poner:
int n = Integer.MIN_VALUE
Número que es -2147483648, porque al ser 1 el bit de la posición 31 el número es negativo, y si todos los demás son nulos, es el entero menor de todos.
Las razones de éso no las daré aquí, sino que es suficiente con saber que si como consecuencia del desplazamiento, cambia el bit de la posición 31, siendo el primero el bit de la posición 0, el número cambiará de signo.
2) El operador >>>, que desplaza todos los bits hacia la derecha tantas posiciones como sea indicado, dejando a la izquierda valores nulos. Los bits no nulos que no quepan serán perdidos, y si hay una conservación del signo, equivale a dividir por 2 elevado al número de bits desplazados. Si el número era negativo, este desplazamiento lo hará positivo, porque el bit de la posición 31 pasará de ser 1 a ser 0.
3) El operador >>, que desplaza todos los bits menos el del signo hacia la derecha tantas posiciones como sea indicado, por lo que el número conservará su signo, algo que ninguno de los otros dos garantiza, por lo que siempre equivale a dividir por 2 elevado al número de bits desplazados.
El operador >> de C y C++, cumple la función que en Java cumple el operador >>>.