Duda con desplazamiento de bits a la derecha de un número entero

¡Qué tal! hace tiempo que no participo en la página, pero pues espero puedan ayudarme. Sucede que estudiando el comportamiento del desplazamiento de bits, me causo confusión el siguiente código:

 

En la teoría según voy entendiendo, el desplazamiento a la derecha con signo con número enteros, si éste es positivo va insertando 0's o 1's, si el número es negativo. En este ejercicio resuelto el número es: 2147483648 pero veo que va insertando 1's por cada desplazamiento, cuando debería insertar 0's, esta es mi confusión, ¿por qué pasa esto?
Ahora probe cambiando el número entero, solo le quite un cero a la constante hexadecimal y que equivale a 134217728 un número más pequeño:
 

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

no es cíclico

No es cíclico pero la bronca es que estás manejando enteros con signo y el 0x80000000 es un número especial, por así decirlo. Los enteros en Java son de 32 bits y van de -2147483648 a 2147483647 (porque el bit 32 es el signo, y los otros 31 son para el valor). Pero por la cosa de que se manejan con complemento a 2, existe un número especial, que puede ser representado como -0 o como 2147483648 y es justamente el que estás usando, que es todo ceros pero con el bit más significativo encendido, para indicar que es un número negativo. En este único caso, el shift a la derecha va metiendo unos en vez de ceros, cuando haces el shift un bit a la vez. Si haces por ejemplo 0x80000000>>31 obtienes 1.

ADD: Si ves los enteros que se imprimen, en vez de solamente los bits, verás que lo que está pasando es que se pasan puros unos para que el comportamiento sea similar a cuando haces el shift con números positivos. Por ejemplo los últimos números si lo haces a partir del positivo más grande, van a ser 8, 4, 2, 1... con tu ejemplo los últimos números son -8, -4, -2, -1.

Imagen de martinillo

ya más claro

Gracias por responder @ezamudio. Estuve haciendo mis pruebas de acuerdo según lo que entendí y aqui esta el programita:

 

A partir del entero positivo (1) más grande se va decrementanto el número hasta llegar 7, 3, 1... debo entender que mencionastes (8, 4, 2) a modo de ejemplo para ver la relación con los numeros negativos.

Y pues en (2) no imprime -0 (bueno supuse que debia imprimir eso) sale el numero más grande negativo, y pues si efectivamente va terminando en -8, -4, -2. No sé si entedí bien con respecto a -0.

en (3) probe lo que comentaste pero pues no salio 1 sino -1.

Gracias por la ayuda.

Imagen de ezamudio

numeros negativos en bits

Suponte que tienes un tipo de dato que es un entero sin signo, de 4 bits. Va del 0 al 15, correcto? Pero si lo quieres manejar con signo, entonces un bit es el signo, y te quedan 3 bits, con lo que puedes contar del 0 al 7 solamente, y en negativo va hasta el -7... ah pero resulta que 0000 es 0, 0111 es 7, y por otra parte tienes 1111 que es -1, y hay otra opcion que es 1000 que es... -0, pero -0 no tiene ningun sentido, de modo que se lo asignas a -8.

Ya pensando mejor en lo que te esta pasando, me parece que tu numero 0x80000000 debe ser -0 o lo que es lo mismo, el numero mas negativo que puede haber. Pero en las pruebas que yo hice no le puse cast y seguramente el compilador lo consideraba como un long o algo asi.

Imagen de martinillo

entonces es algo asi como por definición

Gracias por la ejemplificación, sinceramente no había entendido eso de la representación binaria en este caso de numeros enteros positivos y negativos pero con tu ayuda y otros tutos ya comprendo mejor. Sería entonces por definición que -0 se representaría tomando en cuenta como dices -0 --> -8 (1000) en el int seria -0 --> -2147483648 (10000000000000000000000000000000). Esto por qué sobra un número binario al utilizar un bit para el signo del número, ¿es correcto esto?.

Gracias!!

Imagen de martinillo

investigando más

no había entendido del todo lo que me dijistes, pero pues ahora mejor. Cuando dices que -0 no tiene sentido, tienes razón de hecho ese es el problema que se presenta con signo magnitud y complemento a 1 (despues de investigar más), y es que simplemente con la representación en complemento a 2 no existe la representación de -0, de acuerdo a tu ejemplo con 4 bits 1000 seria -8 (al fin de cuentas veo que lo intentastes explicar de otra manera). Asi que el programa del ejercicio que me causo confusión en un principio era en realidad el número negativo más grande cuando yo estaba equivocado al pensar que era un positivo o el 0 no recuerdo y debia insertar 0´s e lugar de 1's.
 
Te agradezo haberme ayudado!!