Puissance de 2 : fonction ?

Résolu
noname001 Messages postés 21 Date d'inscription dimanche 15 novembre 2009 Statut Membre Dernière intervention 1 mai 2010 - 10 mars 2010 à 15:49
cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 - 12 mars 2010 à 08:42
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

cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 8
11 mars 2010 à 09:13
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
3
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
10 mars 2010 à 22:06
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++
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
11 mars 2010 à 09:48
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++
0
noname001 Messages postés 21 Date d'inscription dimanche 15 novembre 2009 Statut Membre Dernière intervention 1 mai 2010
11 mars 2010 à 21:27
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 ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
11 mars 2010 à 21:34
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++
0
cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 8
12 mars 2010 à 08:42
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
0
Rejoignez-nous