Capítulo 002 Ejercicio 008a (Desplazamiento de datos sin signo)

// Prueba del desplazamiento a la derecha sin signo

/** Los operadores de desplazamiento también manipulan bits. Sólo se pueden utilizar con tipos primitivos enteros.
* El operador de desplazamiento a la izquierda (<<) provoca que el operando de la izquierda del operador sea
* desplazado a la izquierda, tantos bits como se especifique tras el operador (insertando ceros en los bits menos
* significativos). El operador de desplazamiento a la derecha con signo (>>) provoca que el operando de la izquierda
* del operador sea desplazado a la derecha el número de bits que se especifique tras el operador. El desplazamiento a
* la derecha con signo (>>) utiliza la extensión de signo: si el valor es positivo se insertan ceros en los bits
* más significativos; si el valor es negativo, se insertan unos en los bits más significativos. Java también ha
* incorporado el operador de rotación a la derecha sin signo(>>>), que utiliza la extensión cero; independientemente
* del signo, se insertan ceros en los bits mas significativos. Este operador no existe en C ni en C++.
*
* Si se trata de desplazar un char, un byte o un short, éste será convertido a int antes de que el desplazamiento
* tenga lugar y el resultado será también un int. Sólo se utilizaran los cinco bits menos significativos de la parte
* derecha. Esto evita que se desplace un número de bits mayor al número de bits de un int. Si se está trabajando con
* un long, se logrará un resultado long. Sólo se usarán los seis bits menos significativos de la parte derecha, por
* lo que no es posible desplazar más bits que los que hay en un long.
*
* Los desplazamientos pueden combinarse con el signo igual (<<= o >>= o >>>=). El ivalor se reemplaza por el ivalor
* desplazado por el dvalor. Hay un problema, sin embargo, con el desplazamiento sin signo a la derecha combinado con
* la asignación. Si se utiliza con un byte o short no se logra el resultado correcto. En vez de esto, los datos son
* convertidos en un int y desplazados a la derech, y teriormente se truncan al ser asignados de nuevo a sus variables,
* por lo que en esos casos el resultado suele ser -1. El ejemplo siguiente demuestra esto:
*/

public class DesplDatosSinSigno {
public static void main(String args[]){
int i = -1;
i >>>= 10;
System.out.println(i);
long l = -1;
l >>>= 10;
System.out.println(l);
short s = -1;
s >>>= 10;
System.out.println(s);
byte b = -1;
b = -1;
b >>>= 10;
System.out.println(b);
b = -1;
System.out.println(b>>>10);
}
}