PUISSANCE DE 2, VITESSE ALGO, CONCOURS (WIN32)

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
- - Dernière réponse : gnairod
Messages postés
37
Date d'inscription
samedi 22 novembre 2008
Statut
Membre
Dernière intervention
11 avril 2010
- 22 déc. 2008 à 17:22
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/29847-puissance-de-2-vitesse-algo-concours-win32

Afficher la suite 
gnairod
Messages postés
37
Date d'inscription
samedi 22 novembre 2008
Statut
Membre
Dernière intervention
11 avril 2010
-
Ben j'ai gagne.

__declspec(naked) DWORD __fastcall Puiss2SupEgal_GNairod(DWORD d) {
__asm {
cmp ecx, 80000000h
ja short sup
test ecx, ecx
jz short zero
mov eax, ecx
bsr ecx, eax
bsf edx, eax
cmp ecx, edx
je short powof2
mov eax, 1
add ecx, 1
shl eax, cl
ret
powof2:
ret
sup:
mov eax, -1
ret
zero:
xor eax, eax
ret
}
}

Plus rapide que la version de Brunews.
cs_JCDjcd
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
2 -
houlala cette discussion date de longtemps !!
sujet passionnant... oui normalement 2^0=1

on pourrait tout refaire en 64 bits et voir qui va gagner !
je n'aurai qu'a rajouter un "if" et ca tourne !
d'ailleur au passage pour parler un peu de complexite
des algorithmes : le mien est en log(log(param))
gnairod
Messages postés
37
Date d'inscription
samedi 22 novembre 2008
Statut
Membre
Dernière intervention
11 avril 2010
-
Brunews y a un probleme je pense.
Tu dis que la fonction doit retourne la plus proche puissance de 2 sup ou egale au param mais, lorsque i vaut 1 tu retournes 2 pourtant 1 est bien une puissance de 2. 2^0 = 1.

Non?
NitRic
Messages postés
409
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011
-
Oui mais, il faudrait `forcer` le compilateur à la mettre `inline`, parce que avec un `call` elle est très lente.

Mais sinon, félicitation !!!



~(.:: NitRic ::.)~
cs_JCDjcd
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
2 -
juste un question de if au debut, Pb de <= au lieu de < :

//--------------------------------------------
#define FLAG1 0xFFFF0000
#define FLAG2 0xFF00FF00
#define FLAG3 0xF0F0F0F0
#define FLAG4 0xCCCCCCCC
#define FLAG5 0xAAAAAAAA

unsigned the7(unsigned int d)
{
int res;
if(0 == (d & 0xFFFFFFFF)) return 0x00000000;
if(0x80000000 < d) return 0xFFFFFFFF;

d --;
res = 1;
if(d & FLAG1) { d &= FLAG1; res <<= 16; }
if(d & FLAG2) { d &= FLAG2; res <<= 8; }
if(d & FLAG3) { d &= FLAG3; res <<= 4; }
if(d & FLAG4) { d &= FLAG4; res <<= 2; }
if(d & FLAG5) { d &= FLAG5; res <<= 1; }
return res << 1;
}


celle-ci remplie-t-elle toutes les specification ?