división de montaje rápido por 2
Pregunta
¿Hay una manera más rápida de dividir por 2, con signo, en el montaje de aquel en el ejemplo de abajo?
...
mov ecx, 2
idiv ecx
push eax #push the result
...
Solución
Claro:
sar eax, 1
El código de operación sar
difiere de shr
en que el (signo) bit más significativo se conserva en sar
, y se pone a 0 en shr
. El aritmética cambiar página en Wikipedia muestra muchos más detalles sobre esta operación en un contexto general.
Tenga en cuenta que en la máquina de complemento a 2 (que es el 86) En realidad, esto calcula floor(eax / 2)
. En particular, esto significa que para un número entero x :
- para x = 0 , el resultado es 0
- para x> 0 , el resultado es piso (x / 2)
- para x <0 , el resultado es también piso (x / 2) o -ceil (-x / 2)
Este último resultado da resultados que pueden ser inesperado. Por ejemplo, -3 sar 1 resultados en -2, -1 no. Por otra parte, 3 SAR 1 resultados en 1.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow