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
792
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
12 juillet 2019
-
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
792
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
12 juillet 2019
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
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
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
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
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
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
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
792
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
12 juillet 2019
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