2011-03-28 238 views
5

¿Hay algún algoritmo genial con operaciones de bits?¿Cómo encuentran las computadoras el módulo?

+1

teniendo en cuenta el ensamblaje, parece que quieres saber esto a un nivel muy bajo, no es algo para 'x MOD y' como 'restar repetidamente y de x hasta que el resultado sea menor que y' ¿no? Me recuerda escribir rutinas mul/div en un curso de montaje y me sorprendió cuánto tiempo necesitaron ser –

+0

Correcto, me pregunto si hay algún modo inteligente de bajo nivel que se haga en un tiempo mejor que O (n). – Nate

+0

No estoy seguro de qué hace el hardware, pero en la mayoría de los conjuntos de instrucciones 'modulus' y' division' se hacen usando la misma instrucción. La instrucción de división se implementa de modo que el cociente se enviará a un registro y el resto simultáneamente a un segundo registro. – aroth

Respuesta

4

La mayoría de las veces, el módulo se calcula dividiendo los dos números. El cociente se almacena en un registro, y el resto se almacena en el otro registro. Usted iría después del resto.

2

x mod y = x - y * (x/y)

donde (x/y) es una división entera.

1

Aparte del método obvio usando DIV y IDIV (para x86) como se mencionó anteriormente, el resultado de cualquier número modulo'd por una potencia de dos se puede calcular tomando el bit a bit y: x mod y donde y es pow2 es el igual que x AND (y - 1). La mayoría de los compiladores realizan esto cuando es posible, ya que la división es mucho más costosa que operaciones bit a bit

3

Si el divisor es conocido de antemano (por ejemplo, para código producido por un compilador C, esta es una constante conocida en tiempo de compilación) a partir del cual el módulo se puede obtener fácilmente) a veces se puede implementar con una multiplicación y un cambio. Consulte this article para obtener más información (advertencia: esto no es una lectura ligera).

En muchos procesadores, la multiplicación de enteros es mucho más rápida que la división de enteros; algunos procesadores ni siquiera tienen un código de operación de división entera (multiplicación en n -los valores de bits se pueden optimizar en un circuito de profundidad O (log n), mientras que no existe un método conocido para optimizar un circuito de división por debajo de una profundidad de O (n)).

Cuestiones relacionadas