Tout d'abord, je vous rappelle qu'un certain nombre de la forme bn...b2b1b0 en binaire a de la valeur:
number = bn*2^n+...+b2*4+b1*2+b0
Maintenant, quand vous dites que nombre%3, vous avez:
number%3 =3= bn*(2^n % 3)+...+b2*1+b1*2+b0
(J'ai utilisé =3= pour indiquer la congruence modulo 3). Notez également qu' b1*2 =3= -b1*1
Maintenant, je vais écrire tous les 16 divisions à l'aide de + et - et, éventuellement, de multiplication (à noter que la multiplication peut être écrit comme la touche maj ou la somme de la même valeur déplacé à différents endroits. Par exemple 5*x
moyen x+(x<<2)
dans lequel vous calculez x
qu'une seule fois)
Appelons-le nombre n
et disons - Divisible_by_i
est une valeur booléenne. Comme une valeur intermédiaire, imaginez Congruence_by_i
est une valeur conforme à l' n
modulo i
.
Aussi, disons n0
signifie zéro bit de n, n1
signifie que le bit 1 etc, c'est
ni = (n >> i) & 1;
Congruence_by_1 = 0
Congruence_by_2 = n&0x1
Congruence_by_3 = n0-n1+n2-n3+n4-n5+n6-n7+n8-n9+n10-n11+n12-n13+n14-n15+n16-n17+n18-n19+n20-n21+n22-n23+n24-n25+n26-n27+n28-n29+n30-n31
Congruence_by_4 = n&0x3
Congruence_by_5 = n0+2*n1-n2-2*n3+n4+2*n5-n6-2*n7+n8+2*n9-n10-2*n11+n12+2*n13-n14-2*n15+n16+2*n17-n18-2*n19+n20+2*n21-n22-2*n23+n24+2*n25-n26-2*n27+n28+2*n29-n30-2*n31
Congruence_by_7 = n0+2*n1+4*n2+n3+2*n4+4*n5+n6+2*n7+4*n8+n9+2*n10+4*n11+n12+2*n13+4*n14+n15+2*n16+4*n17+n18+2*n19+4*n20+n21+2*n22+4*n23+n24+2*n25+4*n26+n27+2*n28+4*n29+n30+2*n31
Congruence_by_8 = n&0x7
Congruence_by_9 = n0+2*n1+4*n2-n3-2*n4-4*n5+n6+2*n7+4*n8-n9-2*n10-4*n11+n12+2*n13+4*n14-n15-2*n16-4*n17+n18+2*n19+4*n20-n21-2*n22-4*n23+n24+2*n25+4*n26-n27-2*n28-4*n29+n30+2*n31
Congruence_by_11 = n0+2*n1+4*n2+8*n3+5*n4-n5-2*n6-4*n7-8*n8-5*n9+n10+2*n11+4*n12+8*n13+5*n14-n15-2*n16-4*n17-8*n18-5*n19+n20+2*n21+4*n22+8*n23+5*n24-n25-2*n26-4*n27-8*n28-5*n29+n30+2*n31
Congruence_by_13 = n0+2*n1+4*n2+8*n3+3*n4+6*n5-n6-2*n7-4*n8-8*n9-3*n10-6*n11+n12+2*n13+4*n14+8*n15+3*n16+6*n17-n18-2*n19-4*n20-8*n21-3*n22-6*n3+n24+2*n25+4*n26+8*n27+3*n28+6*n29-n30-2*n31
Congruence_by_16 = n&0xF
Ou quand factorisée:
Congruence_by_1 = 0
Congruence_by_2 = n&0x1
Congruence_by_3 = (n0+n2+n4+n6+n8+n10+n12+n14+n16+n18+n20+n22+n24+n26+n28+n30)-(n1+n3+n5+n7+n9+n11+n13+n15+n17+n19+n21+n23+n25+n27+n29+n31)
Congruence_by_4 = n&0x3
Congruence_by_5 = n0+n4+n8+n12+n16+n20+n24+n28-(n2+n6+n10+n14+n18+n22+n26+n30)+2*(n1+n5+n9+n13+n17+n21+n25+n29-(n3+n7+n11+n15+n19+n23+n27+n31))
Congruence_by_7 = n0+n3+n6+n9+n12+n15+n18+n21+n24+n27+n30+2*(n1+n4+n7+n10+n13+n16+n19+n22+n25+n28+n31)+4*(n2+n5+n8+n11+n14+n17+n20+n23+n26+n29)
Congruence_by_8 = n&0x7
Congruence_by_9 = n0+n6+n12+n18+n24+n30-(n3+n9+n15+n21+n27)+2*(n1+n7+n13+n19+n25+n31-(n4+n10+n16+n22+n28))+4*(n2+n8+n14+n20+n26-(n5+n11+n17+n23+n29))
// and so on
Si ces valeurs étant négatif, l'ajouter avec i
jusqu'à ce qu'ils deviennent positifs.
Maintenant, ce que vous devez faire est de manière récursive la nourriture de ces valeurs à travers le même processus que nous a juste fait jusqu' Congruence_by_i
devient de moins de i
(et évidemment >= 0
). Ceci est similaire à ce que nous faisons lorsque nous voulons trouver le reste d'un nombre par 3 ou 9, vous vous souvenez? La somme des chiffres, si elle avait plus d'un chiffre, des chiffres du résultat de nouveau jusqu'à obtenir un seul chiffre.
Maintenant, pour i = 1, 2, 3, 4, 5, 7, 8, 9, 11, 13, 16
:
Divisible_by_i = (Congruence_by_i == 0);
Et pour le reste:
Divisible_by_6 = Divisible_by_3 && Divisible_by_2;
Divisible_by_10 = Divisible_by_5 && Divisible_by_2;
Divisible_by_12 = Divisible_by_4 && Divisible_by_3;
Divisible_by_14 = Divisible_by_7 && Divisible_by_2;
Divisible_by_15 = Divisible_by_5 && Divisible_by_3;
Edit: Notez que certains de ces ajouts pourraient être évités dès le début. Par exemple n0+2*n1+4*n2
est le même que n&0x7
, de même n3+2*n4+4*n5
est (n>>3)&0x7
et donc avec chaque formule, vous n'avez pas à obtenir chaque bit individuellement, je l'ai écrit comme ça, pour la clarté et la similarité de fonctionnement. Pour optimiser chacune des formules, vous devez travailler sur vous-même; groupe des opérandes et factoriser l'opération.