Bonjour tout le monde ! Dans le cadre de la résolution de sudoku, j'aurais besoin de calculer Log2(n) !
Pour ceux qui ne savent pas à ce que cela correspond, c'est tout bêtement : La puissance nécessaire à 2 pour faire n
Dans le monde normal, on utilise souvent ln ou Log10. Dans les deux cas il s'agit juste d'un changement de base (dans ma phrase précédente, changer 2 en e (le chiffre) ou 10). Mais en informatique ca peut être pratique pour savoir quel est le bit à un.
Exemple : Mon nombre est 16 (donc 00010000 en binaire sur 1 octets) et je voudrais passer de 16 à 4 (qui est Log2(n) ou encore le poids du bit à 1).
Maintenant que vous savez mon problème, voici deux solutions que j'ai trouvé et j'aimerais savoir si vous en connaissez une plus rapide !
Première solution : Ln(n)/Ln(2)
C'est la définition mathématique de Log2(n) Problème : le calcul de ln est très très lent et je vais en avoir souvent besoin !
Deuxième solution :
1 2 3 4 5 6 7 8 9 10 11 | int log2(int n){ if(!isAPowerOfTwo(n)) return -1; // Valeur pour dire qu'il y a un bug int i = 0; while( (n % 2) == 0){ ++i; n >> 1; // Fonctionnerai aussi en faisant n /= 2 } return i; } |
Merci d'avance !