Puissance de 2 : fonction ?

Résolu
Signaler
Messages postés
21
Date d'inscription
dimanche 15 novembre 2009
Statut
Membre
Dernière intervention
1 mai 2010
-
Messages postés
793
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
10 février 2021
-
Bonjour à tous,

Existe-il une fonction qui renverrait une valeur ou une bool indiquant qu'un nombre est une puissance de 2 ?

Merci d'avance
(Ps : je pourrais évidemment le faire moi-même mais ça alourdirait mon code)

6 réponses

Messages postés
793
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
10 février 2021
8
Bonjour,
Je pense qu'il n'y a pas de fonction toute faite Mais j'avais utilisé ça : pour tout x > 0 x est une puissance de 2 si (x & (x − 1)) = 0
à utiliser pour ta fonction.
D'autres indications à cette adresse :
http://en.wikipedia.org/wiki/Power_of_two
En espérant que cela t'aidera.
louis
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Je ne vois pas en quoi appeler une fonction perso alourdirait quoi que ce soit par rapport à une fonction fournie par le compilo.

Je ne me souviens pas d'une toute faite.

ciao...
BruNews, MVP VC++
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Une solution sans boucle sur CPU Intel et compatible:
Si result de BSR et BSF égaux alors est puissance de 2.

ciao...
BruNews, MVP VC++
Messages postés
21
Date d'inscription
dimanche 15 novembre 2009
Statut
Membre
Dernière intervention
1 mai 2010

Effectivement, cette technique marche parfaitement louis et avec un minimum de complexité.
Je ne saisi pas comment ce code permet de déterminer si un nombre est oui ou non une puissance de deux , malgré le lecture du lien wiki.
Pourrais-tu m'éclairer ?
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Fonctionne pour TOUT nbr de 32 bits:
// int __fastcall bnIsDwPowTwo(DWORD n)
bnIsDwPowTwo PROC
xor eax, eax
bsr edx, ecx
je short ispowEXIT
bsf eax, ecx
cmp eax, edx
sete al
ispowEXIT:
ret 0
bnIsDwPowTwo ENDP

ciao...
BruNews, MVP VC++
Messages postés
793
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
10 février 2021
8
Il faut étudier la représentation binaire des puissances de 2 ( 1 et x fois 0) et tout autre nombre. Le moins 1 décale d'une position à gauche et ensuite un ET logique.
J'espère t'avoir aider.

louis