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

Algorithmes et structures de données Discussion :

Calcul des unités dans un entier 32bits


Sujet :

Algorithmes et structures de données

  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2003
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Calcul des unités dans un entier 32bits
    salut à tous

    l'exercice
    quelle est la meilleure méthode pour calculer les unités dans un numéro composé de 32bits sans utiliser une boucle
    par exemple
    10 contient 2 unites parce qu'il s'écrit comme ça 1010...
    ******
    solution
    x -= ((x >> 1) & 0x55555555);
    x = (((x >> 2) & 0x33333333) + (x & 0x33333333));
    x = (((x >> 4) + x) & 0x0f0f0f0f);
    x += (x >> 8);
    x += (x >> 16);
    return(x & 0x0000003f);
    est-ce que quelqu'un peut m'expliquer ça!!!!!????

  2. #2
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    Bien le bonjour,

    je ne comprends pas bien ce que tu veux faire.

    à partir d'un nombre codé sur 32 bits tu veux séparer tous les digits (en base 10) ?

  3. #3
    Membre régulier Avatar de titoine1978
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Points : 90
    Points
    90
    Par défaut
    Ca ne serait pas plutot compter le nombre de 1 qu'il y a dans la representation binaire d'un entier 32 bit ?

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Merci de mettre un titre plus clair à l'avenir.

  5. #5
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    x -= ((x >> 1) & 0x55555555);
    On travaille sur des groupes de 2 bits. Pour chaque groupe on soustrait à sa valeur le bit de poid fort.
    En gros (mieux vaut le faire pour constater que ça marche) :
    10=>01
    00=>00
    01=>01
    11=>10
    Et le résultat est que chaque groupe contient en binaire le nombre de 1 qu'il y avait à l'origine sur ce groupe.

    La suite ne consiste plus qu'à sommer les résultats 2 à 2.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    x = (((x >> 2) & 0x33333333) + (x & 0x33333333));
    Sur des groupes de 4 bits on additionne les deux bits de poids fort aux deux bits de poids faible, en masquant avec "0011" pour libérer les deux bits de poids fort.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    x += (x >> 4);
    x &= 0x0f0f0f0f;
    Pour chaque octet on somme les 4 bits de poids fort et les 4 bits de poids faible.
    Et on masque pour nettoyer la partie haute des octets.

    Puis on somme les octets 2 à 2.

    On somme les deux groupes de deux octets.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return(x & 0x0000003f);
    Et on masque pour enlever les débris du calcul.


    Ce code devrait illustrer le commandement "Ton code tu commentera" dans la bible du programmeur

  6. #6
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 886
    Points : 1 526
    Points
    1 526
    Par défaut
    Tiens, ça doit être l'exercice préféré d'un prof sadique, parce qu'il y a quelques temps quelqu'un a posé exactement la même question:

    http://www.developpez.net/forums/showthread.php?t=63710

Discussions similaires

  1. Calcul des 0 et 1 dans une matrice
    Par M77ATTAR dans le forum Débuter
    Réponses: 6
    Dernier message: 25/07/2013, 18h34
  2. [XL-2003] Calcul des possibilités de chemins dans un tableau
    Par orke22 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 11/09/2012, 17h32
  3. Réponses: 1
    Dernier message: 29/04/2010, 14h36
  4. calculer des chiffres pour envoyer dans la bdd
    Par mecmec dans le forum Flash
    Réponses: 1
    Dernier message: 04/07/2007, 09h10

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