Bueno, para detectar si un número es un múltiplo de otro, simplemente necesita hacer x MOD y
. Si el resultado es 0
, entonces es un múltiplo par.
También es cierto que por cada y
que es una potencia de 2
, (x MOD y)
es equivalente a (x AND (y - 1))
.
Por lo tanto:
IF (x AND 3) == 0 THEN
/* multiple of 4 */
EDIT:
bien, que quieren saber por qué (x MOD y) == (x AND (y - 1))
cuando y
es una potencia de 2. Voy a hacer mi mejor esfuerzo para explicar.
Básicamente, si un número es una potencia de 2, entonces tiene un solo bit establecido (ya que el binario es la base 2). Esto significa que todos los bits inferiores están desarmados. Por ejemplo: 16 == 10000b, 8 == 1000b
, etc.
Si resta 1 de estos valores. Terminas con el bit que se configuró como desarmado y todos los bits debajo de él se establecen.
15 = 01111b, 7 = 0111b
, etc. Así que, básicamente, se crea una máscara que se puede utilizar para probar si cualquiera de los bits inferiores se establecieron. Espero que eso esté claro.
EDIT: comentario de Bastien Léonard lo cubre bien también:
si se divide (sin firmar) por 4, que cambia de puesto dos bits a la derecha. Por lo tanto, el resto son esos dos bits, que obtienen perdido al dividir. 4 - 1 = 11b, es decir, una máscara que produce los dos bits más a la derecha cuando ANDA con un valor de .
EDIT: ver esta página explicaciones posiblemente más claras: http://en.wikipedia.org/wiki/Power_of_two#Fast_algorithm_to_check_if_a_positive_number_is_a_power_of_two.
Cubre la detección de potencias de 2 y el uso de Y como una operación de módulo rápido si es una potencia de 2.
um, su respuesta hace uso de la manipulación de bits, mira a toda la respuesta ... – user83255
@ilproxyil, su respuesta ha sido editado desde que comento. – Mithrax
Sí, estaba explicando por qué puede Y con y -1, para obtener el mismo valor que MOD y. –