Obtener modulo y la parte entera de una vez

03/11/2008 - 14:54 por Paul | Informe spam
Hola,

Existe alguna forma de hacer el modulos y el resto de una sola vez.
Es decir, tengo el 12 y quiero obtener de una vez el modulo y l resto
en base a 10:
modulo %10
entera/10

Pues esto pero en una sóla instrucción.

Gracias

Preguntas similare

Leer las respuestas

#6 Alberto Poblacion
04/11/2008 - 07:40 | Informe spam
"Alfredo Novoa" wrote in message
news:
On 3 nov, 22:30, "Alberto Poblacion" <earthling-
wrote:
Si no recuerdo mal, la instrucción DIV (y también IDIV) del i386 no sólo
te devuelve el cociente en el registro EAX, sino que además deja el resto
en
el EDX. Si no existe una instrucción de MSIL que lo encapsule será porque
no
se han molestado en hacerla, pero no porque no se pueda hacer.



Ya, pero se supone que el MSIL debe de ser independiente de la
plataforma x86.



No importa. Aunque muchos procesadores tienen una instrucción de ese
estilo, la gracia es que si se necesita usarlo en algún procesador que no
tenga esa instrucción, el el JIT (o el NGEN) pueden traducir la instrucción
MSIL a varias instrucciones de la CPU que corresponda, con lo que los
ejecutables compilados en .Net no se ven afectados.
Por ejemplo, los IA-64 (Itanium) no tienen una instrucción de división
en coma flotante, y las divisiones se tienen que hacer por software (Intel
proporciona el algoritmo: http://mindhack.cebuano.org/ia64/divsqrt.pdf).
Esto no impide que exista una instrucción de división en MSIL.
Respuesta Responder a este mensaje
#7 Alfredo Novoa
04/11/2008 - 12:07 | Informe spam
El Tue, 4 Nov 2008 07:40:51 +0100, Alberto Poblacion escribió:

"Alfredo Novoa" wrote in message
news:

No importa. Aunque muchos procesadores tienen una instrucción de ese
estilo, la gracia es que si se necesita usarlo en algún procesador que no
tenga esa instrucción, el el JIT (o el NGEN) pueden traducir la instrucción
MSIL a varias instrucciones de la CPU que corresponda, con lo que los
ejecutables compilados en .Net no se ven afectados.



Ya, pero no creo que les parezca muy interesante introducir un segundo tipo
de división "raro" por que es un más rápido en una determinada plataforma
en algunos casos raros. Sería una división que deja dos valores en la pila
en lugar de uno.

Por ejemplo, los IA-64 (Itanium) no tienen una instrucción de división
en coma flotante, y las divisiones se tienen que hacer por software (Intel
proporciona el algoritmo: http://mindhack.cebuano.org/ia64/divsqrt.pdf).
Esto no impide que exista una instrucción de división en MSIL.



Pero en este caso no ganaríamos nada con esa optimización y con lo que les
cuesta optimizar las cosas a los chicos del compilador de C#, como para que
se molesten :-)


Saludos
Alfredo
Respuesta Responder a este mensaje
#8 Alberto Poblacion
04/11/2008 - 12:28 | Informe spam
"Alfredo Novoa" wrote in message
news:jfvp9rlzvh6i.1lozi2x2nua7h$
Ya, pero no creo que les parezca muy interesante introducir un segundo
tipo
de división "raro" por que es un más rápido en una determinada plataforma
en algunos casos raros. Sería una división que deja dos valores en la pila
en lugar de uno.



Sí, sí. Si yo no digo que yo sea partidario de que incluyan esta
instrucción. Lo comentaba a efectos de la respuesta de Rafael, que decía que
había que hacer dos operaciones porque no era posible otra manera. Y yo
decía que como poderse, sí que se podría. Otra cosa es que los diseñadores
de .Net hayan considerado que sea una operación lo bastante frecuente como
para que merezca la pena introducir esta optimización, y ahi estoy de
acuerdo en que probablemente no valga la pena hacerlo.
Respuesta Responder a este mensaje
#9 RFOG
06/11/2008 - 16:41 | Informe spam
Maremía maremía la que se ha armado. :-)

Alberto: lo que ha evolucionado el ensamblador. En mis tiempos creo que esa
instrucción no existía, al menos no en los x86 originales (que es cuando más
o menos dejé de hacer cosas en ensamblador).

A lo que yo me refería, es a que da igual que se pueda hacer o no en una
sola instrucción, ya que C# no tiene ninguna construcción para meter dos
variables de golpe tras una sentencia, y menos aún cuando está el MSIL en
medio.

Y si se pudiera, empaquetada en una sola, luego habría que sacar ambos
valores mediante algún tipo de operación lógica de separación de bits, con
lo que más o menos sería lo mismo en cuanto a rendimiento, ya que al
calcularlo también habría que meter el resultado empaquetado.


"Alberto Poblacion" wrote
in message news:
"Alfredo Novoa" wrote in message
news:jfvp9rlzvh6i.1lozi2x2nua7h$
Ya, pero no creo que les parezca muy interesante introducir un segundo
tipo
de división "raro" por que es un más rápido en una determinada plataforma
en algunos casos raros. Sería una división que deja dos valores en la
pila
en lugar de uno.



Sí, sí. Si yo no digo que yo sea partidario de que incluyan esta
instrucción. Lo comentaba a efectos de la respuesta de Rafael, que decía
que había que hacer dos operaciones porque no era posible otra manera. Y
yo decía que como poderse, sí que se podría. Otra cosa es que los
diseñadores de .Net hayan considerado que sea una operación lo bastante
frecuente como para que merezca la pena introducir esta optimización, y
ahi estoy de acuerdo en que probablemente no valga la pena hacerlo.




Microsoft Visual C++ MVP
==Mi blog sobre programación: http://geeks.ms/blogs/rfog
Momentos Leves: http://momentosleves.blogspot.com/
Cosas mías: http://rfog.blogsome.com/
Libros, ciencia ficción y programación
La libertad no es poder actuar arbitrariamente sino la capacidad de hacerlo
sensatamente.
Respuesta Responder a este mensaje
#10 Alberto Poblacion
06/11/2008 - 18:07 | Informe spam
"RFOG" wrote in message
news:
A lo que yo me refería, es a que da igual que se pueda hacer o no en una
sola instrucción, ya que C# no tiene ninguna construcción para meter dos
variables de golpe tras una sentencia, y menos aún cuando está el MSIL en
medio.

Y si se pudiera, empaquetada en una sola, luego habría que sacar ambos
valores mediante algún tipo de operación lógica de separación de bits, con
lo que más o menos sería lo mismo en cuanto a rendimiento, ya que al
calcularlo también habría que meter el resultado empaquetado.



Bueno, mi hipótesis era que la división y el módulo podrían ser
operaciones comparativamente lentas frente al movimiento de un dato de un
registro a una ubicación en memoria. Por lo tanto, si una única instrucción
en ensamblador podía obtener de golpe el cociente y el resto, era más rápido
que tener que realizar dos operaciones de división separadas, aunque en
ambos casos luego hubiera que realizar un movimiento de dos datos para
almacenar los resultados.

Por supuesto, (y como ya ha mencionado Alfredo) probablemente el equipo
de desarrollo de .Net no haya considerado que esta sea una operación lo
suficientemente frecuente y/o importante como para que merezca la pena hacer
esta optimización, sobre todo teniendo en cuenta que hay que meter un paso
intermedio a través del MSIL para que luego el JIT genere el correspondiente
código máquina optimizado (y yo estoy de acuerdo, no estoy sugiriendo que
añadan esta instrucción, sino sólo haciendo elucubraciones hipotéticas).
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida