Puissance de 2, vitesse algo, concours (win32)

Soyez le premier à donner votre avis sur cette source.

Vue 6 346 fois - Téléchargée 315 fois

Description

Cette fonction retourne la plus proche puissance de 2 >= au param.
Si param == 0 doit retourner 0.
Si param > (2 puiss 31) doit retourner (DWORD) -1;

Prog de test complet dans le zip, suffira de modifier fonctions pour voir les écarts.
Comparatif C et ASM dans le prog, si vous trouvez + rapide sans modifier la boucle de test, prière de publier la fonction dans les comments.

SEULE CONTRAINTE: Pas de table précalculée ni série de 32 'if' ou chose de ce genre pour cause de taille de code.

Le sujet a déjà été étudié sur forum:
http://www.cppfrance.com/forum.v2.aspx?ID=402227

A vos claviers et merci de votre participation.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
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
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 4
22 déc. 2008 à 17:18
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
22 déc. 2008 à 15:33
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 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011
20 mars 2005 à 04:55
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 4
20 mars 2005 à 01:52
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 ?
Afficher les 75 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.