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.
22 déc. 2008 à 17:22
__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.
22 déc. 2008 à 17:18
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))
22 déc. 2008 à 15:33
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?
20 mars 2005 à 04:55
Mais sinon, félicitation !!!
~(.:: NitRic ::.)~
20 mars 2005 à 01:52
//--------------------------------------------
#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 ?
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.