Eh bien, pour détecter si un nombre est un multiple d'un autre, il suffit de faire x MOD y
. Si le résultat est 0
, alors il s'agit d'un multiple pair.
Il est vrai aussi que pour chaque y
qui est une puissance de 2
, (x MOD y)
équivaut à (x AND (y - 1))
.
Par conséquent:
IF (x AND 3) == 0 THEN
/* multiple of 4 */
EDIT:
ok, vous voulez savoir pourquoi (x MOD y) == (x AND (y - 1))
quand y
est une puissance de 2. Je ferai de mon mieux pour expliquer. Fondamentalement, si un nombre est une puissance de 2, alors il a un seul ensemble de bits (puisque binaire est la base 2). Cela signifie que tous les bits inférieurs sont désactivés. Par exemple: 16 == 10000b, 8 == 1000b
, etc.
Si vous soustrayez 1 à l'une de ces valeurs. Vous vous retrouvez avec le bit qui a été mis en place et tous les bits en dessous sont définis. Donc, fondamentalement, il crée un masque qui peut être utilisé pour tester si l'un des bits inférieurs a été défini. J'espère que c'était clair.
EDIT: commentaire de Bastien Léonard couvre bien aussi:
si vous divisez (non signé) 4, vous décaler deux bits vers la droite. Ainsi, le reste est ces deux bits, qui perdent lorsque vous divisez. 4 - 1 = 11b, c'est-à-dire, un masque qui donne les deux bits les plus à droite lorsque vous ET le avec une valeur .
EDIT: voir cette page pour obtenir des explications plus claires possible: http://en.wikipedia.org/wiki/Power_of_two#Fast_algorithm_to_check_if_a_positive_number_is_a_power_of_two.
Il couvre la détection des puissances de 2 et l'utilisation et comme une opération rapide modulo si elle est une puissance de 2.
um, sa réponse n'utilise la manipulation de bits, regardez toute réponse ... – user83255
@ilproxyil, sa réponse a été modifiée depuis que je commentais. – Mithrax
Oui, j'expliquais pourquoi vous pouvez ET avec y -1, pour obtenir la même valeur que MOD y. –