Maison >développement back-end >C++ >Comment pouvons-nous déterminer efficacement si un nombre est une puissance de 2?
Déterminez si le nombre donné est la puissance de 2, qui nécessite un algorithme simple et précis. L'auteur propose deux algorithmes, mais a rencontré le problème lors de l'utilisation du calcul des nombres.
Le premier algorithme
Le premier algorithme Utilisez un cycle simple pour vérifier la puissance de 2 à travers le déplacement:
Cette méthode est simple et facile à comprendre, et elle peut fonctionner parfaitement pour n'importe quelle valeur IsPowerOfTwo
.
<code class="language-c#">private bool IsPowerOfTwo(ulong number) { if (number == 0) return false; for (ulong power = 1; power > 0; power = power << 1) { if (power == number) return true; if (power > number) return false; } return false; }</code>Le deuxième algorithme
ulong
Cependant, en raison du problème du rejet, cet algorithme ne peut pas être correctement géré 9223372036854775809.
L'algorithme amélioré IsPowerOfTwo_2
<code class="language-c#">private bool IsPowerOfTwo_2(ulong number) { double log = Math.Log(number, 2); double pow = Math.Pow(2, Math.Round(log)); return pow == number; }</code>
Explication de l'algorithme
Cet algorithme amélioré utilise intelligemment l'opération de bit:
<code class="language-c#">bool IsPowerOfTwo(ulong x) { return (x & (x - 1)) == 0; }</code>Opérateur de bits Vérifiez si les deux bits de la position correspondante sont 1.
Soustrayez 1 du nombre pour transformer tout le 1 à 0, et tournez tout 0 à 1.
Si le nombre est la puissance de 2, le binaire indique qu'il n'y aura qu'un seul chiffre.Lorsque le nombre et (x -1) sont effectués et l'opération, tout le bit sauf 1 à l'extrême droite sera 0.
&
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!