>>>
es el operador logical right shift en Java.
Cambia en un cero a la izquierda en lugar de conservar el bit de signo. El autor de la entrada del blog, incluso proporciona una implementación en C++:
mid = ((unsigned int)low + (unsigned int)high)) >> 1;
... si números sin signo de cambio derecho, preservando el bit de signo no tiene ningún sentido (ya que no es ningún bit de signo) entonces el compilador obviamente usa cambios lógicos en lugar de aritméticos.
El código anterior explota la (bit 32º asumiendo enteros de 32 bits) MSB: añadir low
y high
que son ambos números enteros no negativos y montar así en 31 bits Nunca desborda los completos de 32 bits, sino que se extiende a la MSB. Al desplazarlo hacia la derecha, el número de 32 bits se divide efectivamente entre dos y el 32º bit se borra nuevamente, por lo que el resultado es positivo.
La verdad es que el operador >>>
en Java es solo una solución al hecho de que el lenguaje no proporciona los tipos de datos unsigned
.
La entrada del blog decía "En C y C++ (donde * no * tienes el operador >>>), puedes hacer esto" –
Nota: '>>>' a veces se usa para la rotación en modo bit. No puedo pensar en ese tipo de lenguaje en este momento (pensé en VHDL o Verilog, pero no puedo encontrar una referencia), pero sé que lo he visto ... – Potatoswatter