2011-04-03 15 views
6

En this blog post el autor ha sugerido la siguiente como la corrección de errores:>>> ¿Cuál es la operación en C++

int mid = (low + high) >>> 1; 

¿Alguien sabe qué es esto >>> operador? Ciertamente no es allí en la siguiente lista de referencia del operador:

¿Qué es y cómo que soluciona el problema de desbordamiento?

+5

La entrada del blog decía "En C y C++ (donde * no * tienes el operador >>>), puedes hacer esto" –

+0

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

Respuesta

8

>>> no es parte de C++. El blog contiene código en Java.

Consulte el tutorial en línea de Java here en operadores de desplazamiento Bitwise. Dice

El operador de desplazamiento a la derecha sin signo ">>>" desplaza un cero a la posición más a la izquierda, mientras que la posición más a la izquierda después de ">>" depende de la extensión de signo.

2

>>> no es operador C++. Creo que es un operador en lenguaje Java. ¡No estoy seguro!

EDITAR:

Sí. Ese es el operador de Java. Consulte the link en el artículo que proporcionó. ¡El artículo está usando lenguaje Java!

+0

En Java sería un cambio a la derecha sin signo extendido. Algún tipo de división "optimizada" por 2. –

1

Es un operador de Java, no relacionado con C++.

Sin embargo, todo lo que el autor del blog hace es cambiar la división por 2 con un cambio de sentido de bit hacia la derecha (es decir, cambiar el valor por 1 es similar a dividir por 2^1).

La misma funcionalidad, diferente salida de código de máquina (las operaciones de cambio de bit son casi siempre más rápidas que la multiplicación/división en la mayoría de las arquitecturas).

+0

Para las constantes apropiadas (es decir, la potencia de dos), las multiplicaciones/divisiones casi siempre se reemplazan con operaciones de cambio de bit por cualquier compilador de optimización – Grizzly

2

>>> 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 highque 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.

3

>>> El operador se encuentra en un fragmento de código Java , y es el operador de desplazamiento a la derecha sin signo . Se diferencia del operador >> en su tratamiento de valores con signo: el operador >> aplica sign extension durante el turno, mientras que el operador >>> simplemente inserta un cero en las posiciones de bit "vacías" por el cambio.

Lamentablemente, en C++ no existe el cambio de signo y el desplazamiento a la derecha sin signo, solo tenemos el operador >>, cuyo comportamiento en los valores con signo negativo está definido por la implementación. Para emular un comportamiento como el de >>>, debe realizar algunos moldes a unsigned int antes de aplicar el turno (como se muestra en el fragmento de código inmediatamente después del que publicó).

1

La expresión de Java x >>> y es más o menos equivalente a la expresión de C++ unsigned(x) >> y.

Cuestiones relacionadas