IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Arrondir a la puissance de deux supérieure.


Sujet :

C

  1. #1
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut Arrondir a la puissance de deux supérieure.
    Voila, tout est dans le titre,
    j'essaie de faire une fonction qui prend un unsigned int en paramètre et qui me retourne un unsigned int qui est l'arrondi à la puissance de deux supérieure.

    Exemple, je donne 20 elle me rend 32.
    Je n'ai rien trouvé mis à part la "brute force".
    c'est à dire que j'initialise un compteur et que je boucle tant que 2^count < paramètre et que 2^(count + 1) > paramètre.

    je voulais savoir s'il existait quelque chose un chouia plus optimisé?
    je me demande aussi si le décalage de bits ne pourrait pas me permettre de calculer 2^n plus facilement. (peut être même avec une macro?)

    merci de votre aide.
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    On peut s'en tirer avec des logarithmes :

    on cherche la puissance de 2 qui va bien pour x = 200 :

    avant, on a remarqué que :

    2^7 = 128
    2^8 = 256
    donc
    log(128)/log(2) = 7
    log(256)/log(2) = 8

    on calcule log(x) / log(2) = 7.64...
    on arrondi -> 7
    on incrémente et on calcule la puissance 2 de ce nombre, on obtient
    2^8 = 256.

    cas particulier si x est une puissance de 2, log(x) sera entier, il faut donc prendre log(x-1).

    Au final, cela nous donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include math.h>
    /* attention, ne pas appeler cette fonction avec x < 2*/
    int arrondi(int x, int base) 
    {
       double d = log(x-1)/log(base);
       int i = d;
     
       return pow(base, d+1);
    }
    Dernière modification par Invité(e) ; 04/03/2010 à 23h17. Motif: ajout généricité : tant qu'a pas être performant, autant être générique.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Salut

    En binaire, 20 donne : 0001 0100.
    Pour ce que tu veux faire, à mon avis, il n'y a pas beaucoup de solutions.
    Il ne faut en fait garder que le 1er "1" binaire à partir de la gauche (en rouge ici), virer tous les autres puis décaler d'un bit à gauche ensuite à nouveau.
    Tu peux éventuellement faire un décalage de bits vers la droite jusqu'à ce ton résultat soit nul, en incrémentant un compteur à chaque décalage. Puis tu refais l'opération inverse, mais vers la gauche cette fois, en partant initialement avec la valeur 1, en décalant jusqu'à ce que la décrémentation du compteur arrive à 0.
    Je ne vois pas trop sinon. Y a peut-être mieux (?).

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    La question a déjà été traitée en détail il y a 3 ans sur le forum ici
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    merci pour l'ensemble de vos info
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Recherche dichotomique pour la puissance de 2 supérieure
    Par fearyourself dans le forum Télécharger
    Réponses: 0
    Dernier message: 30/11/2010, 17h15
  2. Arrondir à l'heure à l'inférieur ou supérieur
    Par arnaudperfect dans le forum Excel
    Réponses: 4
    Dernier message: 12/05/2009, 13h03
  3. Somme de puissances de deux
    Par knowl dans le forum C#
    Réponses: 5
    Dernier message: 21/01/2008, 00h38
  4. Puissance de deux supérieure
    Par NiamorH dans le forum C
    Réponses: 30
    Dernier message: 02/04/2007, 10h29
  5. texture et puissance de deux..encore
    Par mm2405 dans le forum OpenGL
    Réponses: 11
    Dernier message: 12/07/2006, 12h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo