¿Cuál es mejor opción para dividir un número entero por 2?

Resuelto Abhineet asked hace 12 años • 22 respuestas

¿Cuál de las siguientes técnicas es la mejor opción para dividir un número entero entre 2 y por qué?

Técnica 1:

x = x >> 1;

Técnica 2:

x = x / 2;

Aquí xhay un número entero.

Abhineet avatar May 21 '12 14:05 Abhineet
Aceptado

Utilice la operación que mejor describa lo que está intentando hacer.

  • Si trata el número como una secuencia de bits, utilice bitshift.
  • Si lo trata como un valor numérico, utilice la división.

Tenga en cuenta que no son exactamente equivalentes. Pueden dar resultados diferentes para números enteros negativos. Por ejemplo:

-5 / 2  = -2
-5 >> 1 = -3

(ideona)

Mark Byers avatar May 21 '2012 07:05 Mark Byers

¿El primero parece dividirse? No. Si quieres dividir, usa x / 2. El compilador puede optimizarlo para usar desplazamiento de bits si es posible (se llama reducción de fuerza), lo que lo convierte en una microoptimización inútil si lo hace por su cuenta.

Cat Plus Plus avatar May 21 '2012 07:05 Cat Plus Plus

Para seguir adelante: hay muchas razones para favorecer el uso. x = x / 2; Aquí hay algunas:

  • expresa su intención más claramente (asumiendo que no se trata de bits de registro que hacen girar o algo así)

  • el compilador reducirá esto a una operación de cambio de todos modos

  • Incluso si el compilador no lo redujo y eligió una operación más lenta que el cambio, la probabilidad de que esto termine afectando el rendimiento de su programa de una manera mensurable es en sí misma extremadamente pequeña (y si lo afecta de manera mensurable, entonces tiene una probabilidad real). razón para usar un turno)

  • Si la división va a ser parte de una expresión más grande, es más probable que obtengas la prioridad correcta si usas el operador de división:

    x = x / 2 + 5;
    x = x >> 1 + 5;  // not the same as above
    
  • la aritmética con signos podría complicar las cosas incluso más que el problema de precedencia mencionado anteriormente

  • Para reiterar: el compilador ya hará esto por usted de todos modos. De hecho, convertirá la división por una constante en una serie de desplazamientos, sumas y multiplicaciones para todo tipo de números, no solo potencias de dos. Consulte esta pregunta para obtener enlaces a aún más información sobre esto.

En resumen, no se compra nada codificando un desplazamiento cuando en realidad se quiere multiplicar o dividir, excepto tal vez una mayor posibilidad de introducir un error. Ha pasado toda una vida desde que los compiladores no fueron lo suficientemente inteligentes como para optimizar este tipo de cosas para cambiarlas cuando fuera apropiado.

Michael Burr avatar May 21 '2012 08:05 Michael Burr

¿Cuál es la mejor opción y por qué dividir el número entero entre 2?

Depende de lo que quieras decir con mejor .

Si quieres que tus colegas te odien o que tu código sea difícil de leer, definitivamente elegiría la primera opción.

Si quieres dividir un número entre 2, elige el segundo.

Los dos no son equivalentes, no se comportan igual si el número es negativo o dentro de expresiones más grandes: el desplazamiento de bits tiene una prioridad menor que +o -, la división tiene una prioridad mayor.

Debes escribir tu código para expresar cuál es su intención. Si lo que le preocupa es el rendimiento, no se preocupe, el optimizador hace un buen trabajo en este tipo de microoptimizaciones.

Luchian Grigore avatar May 21 '2012 07:05 Luchian Grigore