begin process at 2012 05 30 23:03:23
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Maths & Algorithmes

 > 

VITESSE ALGO, CONCOURS POUR TOUS


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

VITESSE ALGO, CONCOURS POUR TOUS

lundi 28 février 2005 à 19:22:47 | VITESSE ALGO, CONCOURS POUR TOUS

BruNews

Administrateur CodeS-SourceS

DWORD __fastcall Puiss2SupEgal_C(DWORD d)
{
  DWORD r, n;
  if(!d) return 0;
  if(d & 1) d++;
  r = 0x80000000;
  n = d;
  if(d & 0x80000000) goto verifInf;
  do {
    r >>= 1;
    d <<= 1;
  } while(!(d & 0x80000000));
verifInf:
  if(r < n) r <<= 1;
  if(!r) r = 0xFFFFFFFF;
  return r;
}

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

Voila, je suis ouvert à toute proposition plus rapide, prog de test est fait.
Pas de table précalculée ni série de 32 'if' ou chose de ce genre pour cause de taille de code.
J'ai deja fait version ASM (dispo sur demande), est 6 fois + rapide que celle ci mais je voudrais savoir si vous avez des idées d'amélioration en C.

Toutes les propositions seront mesurées.
A vos claviers et merci de votre participation.

ciao...
BruNews, MVP VC++
lundi 28 février 2005 à 20:47:35 | Re : VITESSE ALGO, CONCOURS POUR TOUS

Matt67

Bonsoir,

J'essaie :

unsigned Puiss2SupEgal_C(unsigned d)
{
  unsigned Depart = 0x80000000;
 
      // Difficile de faire mieux
  if(!d) return 0;

      // Ca tombe pile poil
  if((d & d-1) == 0)
    return d;

      // Trop grand
  if(d > Depart)
    return 0xFFFFFF;


  while((Depart & d) == 0)
    Depart >>= 1;
   
  Depart <<= 1;
  return Depart;
   
}

Matt...
lundi 28 février 2005 à 21:05:47 | Re : VITESSE ALGO, CONCOURS POUR TOUS

BruNews

Administrateur CodeS-SourceS
Merci je teste, résultats sous peu.

ciao...
BruNews, MVP VC++
lundi 28 février 2005 à 21:15:44 | Re : VITESSE ALGO, CONCOURS POUR TOUS

BruNews

Administrateur CodeS-SourceS
598283328 ticks la mienne
599283328 la tienne
on peut dire équivalent, je n'ai pas vérifié les résultats de la fonction.

ciao...
BruNews, MVP VC++
lundi 28 février 2005 à 21:23:14 | Re : VITESSE ALGO, CONCOURS POUR TOUS

Matt67

Bonsoir,

(Bien essayé Matt)
Ok, je vais voir si on peut faire mieux,

Matt...
lundi 28 février 2005 à 21:33:30 | Re : VITESSE ALGO, CONCOURS POUR TOUS

Matt67

Une petite modif dans la boucle while (je ne pense pas que ca change grand chose mais bon)

unsigned Puiss2SupEgal_C(unsigned d)
{
  unsigned Depart = 0x80000000;
 
      // Difficile de faire mieux
  if(!d) return 0;

      // Ca tombe pile poil
  if(!(d & d-1))
    return d;

      // Trop grand
  if(d > Depart)
    return 0xFFFFFF;

  while(((Depart >>= 1) & d) == 0);
  Depart <<= 1;

  return Depart;
}

Matt...
lundi 28 février 2005 à 21:38:28 | Re : VITESSE ALGO, CONCOURS POUR TOUS

BruNews

Administrateur CodeS-SourceS
identique.

Le souk c'est qu'on a pas d'opérateur de scann bits en C, on est obligé de boucler.

ciao...
BruNews, MVP VC++
lundi 28 février 2005 à 21:46:59 | Re : VITESSE ALGO, CONCOURS POUR TOUS

Matt67

Je ne vois pas trop comment faire autrement.
Si quelqu'un trouve un autre algo !!!
Bonne soirée,
Matt...
lundi 28 février 2005 à 22:07:46 | Re : VITESSE ALGO, CONCOURS POUR TOUS

steve_clamage

une version avec une lookup table:

unsigned Puiss2SupEgal_C( unsigned u )
{
    static const unsigned mask [] =
    {
        0x00000000,
       
        0x00000001,
        0x00000002,
        0x00000004,
        0x00000008,
       
        0x00000010,
        0x00000020,
        0x00000040,
        0x00000080,
       
        0x00000100,
        0x00000200,
        0x00000400,
        0x00000800,
       
        0x00001000,
        0x00002000,
        0x00004000,
        0x00008000,
       
        0x00010000,
        0x00020000,
        0x00040000,
        0x00080000,
       
        0x00100000,
        0x00200000,
        0x00400000,
        0x00800000,
       
        0x01000000,
        0x02000000,
        0x04000000,
        0x08000000,
       
        0x10000000,
        0x20000000,
        0x40000000,
        0x80000000,
       
        0xffffffff
    };
   
    const int *p = mask;
 
    while( *p < u)
       p++;
    return *p;
}


lundi 28 février 2005 à 22:10:03 | Re : VITESSE ALGO, CONCOURS POUR TOUS

Hylvenir

salut,

1 doit renvoyer 2 ou 1  ? vaut deux fonctions ne sont pas d'accord.

bizarre sur les perfs, je trouve quasiment deux fois plus rapide pour la fonction de Matt ?
Je vais essayer avec cl pour voir.


Ma participation à la saturation du net:
http://hylvenir.free.fr

1 2 3 4

Cette discussion est classée dans : algo, dword, vitesse, param, 0x80000000


Répondre à ce message

Sujets en rapport avec ce message

ScannerIP() [ par JCpp ] Il y a-t-il un moyen d'ouvrir 100 Theard sans écrire :DWORD WINAPI ScaneIP1(LPVOID param){..}DWORD WINAPI ScaneIP2(LPVOID param){..}. Problème de compilation d'une Dll [ par DrUn ] Bonjour, J'ai une Dll qui a été compilée par visual c++ il y a quelques temps. Cette Dll fait du WinHTTP. Elle n'a pas été modifiée et mon SDK non plu Prob de thread [ par sebastienbro ] Bonjour, j'ai un problème avec des thread, je n'arrive pas a en créer un :(Voici mon code : HANDLE hThread1;DWORD dwThreadId1;DWORD WINAPI T Algo de redimensionnement d'images [ par stageSAP ] Bonjour, Je recherche un algorithme pour redimensionner une image à partir de la matrice image ou une librairie borland c++ qui fait cela. Merci Algo trop lent :( [ par MoDDiB ] Bon tout d'abord je tient à préciser qu'il s'agit du concours prologin auquel je compte participer donc si certaines personnes ne veulent pas m'aider Vitesse Telechargement [ par BzsReg ] Voila je fait un prog qui doit telecharger un fichier en http, mais je voudrait fixer la vitesse maxi du telechargement quelqu'un a une idee sur comme RegOpenKeyEx [ par guitoulefoux ] Bonjour,Pourriez vous m'aider a corriger mon erreur.Voici mon bout de code :TCHAR MenDema[1024];[...]HKEY hKey;RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWA transformer un jour du mois en DWORD [ par myocean ] Dans le cas de la structure AT_INFOla variable DaysOfMonth est au format DWORD et elle recoit comme paramêtre des bit où le bit 0 est le 1er du mois boite de dialogue C [ par benhamid ] Bonjour, J'ai du mal à faire des boites de dialogue en C.Quelqu'un peut il m'aider svp.Mon problème est le suivant:Je voudrais qu'en executant le pg ç GetFileVersionInfoSize, probleme de link [ par gege1024 ] en utilisant : GetFileVersionInfoSizej'ai un probleme de lien, et je ne sais pas d'ou ca vient (# include ???) DWORD info; DWORD toto; info =


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,936 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales