¡No tiene sentido porque lo que estás tratando de hacer no optimiza el proceso resultante!
Oye, no leí en ninguna parte de su pregunta que tuviera intención de optimizar.
Electric Engg La gente nunca deja de ser curiosa independientemente de su "utilidad". Somos como obsesivos obsesivos de artículos que lees en las noticias donde apilan sus desvanes, sótanos, dormitorios y salas de estar con basura que creen que algún día te vendrá bien. Al menos ese fue el caso cuando estaba en la escuela de Engg hace poco menos de 30 años. Te animo a que continúes en tu búsqueda para acumular conocimiento "inútil" que parece tener pocas posibilidades de optimizar tu vida o estilo de vida. ¿Por qué depender del compilador cuando puede hacerlo mediante un algoritmo codificado a mano? ¿Yah? Sé un poco aventurero, ya sabes. Ok, enuf, dissing personas que expresan desdén en su búsqueda del conocimiento.
¿Recuerdas en tu escuela media, la forma en que te enseñaron a hacer tu división? 437/24, p.
_____
24|437
018
-----
24|437
24
-----
197
24
-----
5
El número que está sujeto a la división, 437, se denomina dividendo. 24 es el divisor, el resultado 18 es el cociente, y 5 es el resto. Al igual que cuando declara sus impuestos, debe completar los beneficios que había obtenido de los "dividendos" en existencia, lo cual es un nombre inapropiado. Lo que completa en el formulario de impuestos es un múltiplo del cociente de una gran porción de dividendo. No recibió el dividendo, sino porciones de dividendos; de lo contrario, significaría que poseía el 100% de las acciones.
___________
11000|110110101
000010010
-----------
11000|110110101
11000
----------
000110101 remainder=subtract divisor from dividend
11000000 shift divisor right and append 0 to quotient until
1100000 divisor is not greater than remainder.
110000 Yihaa!
----------
000101 remainder=subtract shifted divisor from remainder
11000 shift divisor right and append 0 to quotient until
1100 divisor is not greater than remainder.
----------
oops, cannot shift anymore.
Lo anterior, como usted ya sabe, es la división TRUE. Lo cual se logra al restar por un divisor desplazado.
Lo que quiere es lograr lo mismo simplemente cambiando el dividendo. Eso, desafortunadamente no se puede hacer a menos que el divisor sea un poder exponencial de 2 (2,4,8,16). Lo cual es un hecho obvio de la aritmética binaria. O, al menos, no conozco ningún método que pueda hacerlo sin una aproximación y técnicas intrapolativas.
Por lo tanto, debe usar una combinación de cambio de dividendo y división verdadera. p.
24 = 2 x 2 x 2 x 3
En primer lugar, dividir 437 por 8 utilizando desplazamiento binario para obtener 010010 y luego usar la verdadera división de dividir por 3:
010010
--------
11|110110
11
-------
011
11
-----
0
lo que equivale a 010010 = 18.
Voila.
¿Cómo se determina 24 = 2^8 x 3?
Al desplazar hacia la derecha 11000 hasta llegar a un 1.
Lo que significa, que podría cambiar el dividendo el mismo número de veces que se desplazaría el divisor hasta que el divisor realiza un 1.
Por lo tanto, obviamente, este método no funcionaría si un divisor es impar. por ejemplo, no funcionará para el divisor 25, pero funcionará un poco para el divisor 50.
Puede haber, hay métodos predictivos que podrían interpolar un divisor como 13 para estar entre 2^3 = 8 y 2^4 = 16. Si hay, no estoy familiarizado con ellos.
Lo que necesita explorar es utilizar una serie numérica.Por ejemplo dividiendo por 25:
1 1 1 1 1
__ = __ - ___ - ___ + ___ - ... until the precision you require.
25 16 64 128 256
donde la forma general de la serie es
1 1 b1 bn
_ = ___ + _______ + ... + ______
D 2^k 2^(k+1) 2^(k+n)
donde Bn es o bien -1, 0 o 1.
Espero que mi manipulación binaria anterior no tenga errores o errores tipográficos. Si es así, miles de disculpas.
¿Por qué? ¿Esto es para ser una optimización? ¿Qué estás optimizando? ¿Estás seguro de que necesita ser optimizado? –
¿Qué te hace pensar que esto es posible? – mikerobi
Jonathan tiene razón: si desea utilizar esto como una optimización, debería dejar que el compilador haga el trabajo por usted, ya que los compiladores son mejores que (la mayoría) de los humanos al hacer tales cosas. Sin embargo, si solo quieres saberlo, no creo que haya una breve guía sobre cómo convertir entre división y desplazamiento. – phimuemue