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 :

Tutoriel pour apprendre à compacter des valeurs booléennes


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Community Manager

    Profil pro
    Inscrit en
    Avril 2014
    Messages
    4 207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2014
    Messages : 4 207
    Par défaut Tutoriel pour apprendre à compacter des valeurs booléennes
    Chers membres du club,

    J'ai le plaisir de vous présenter ce tutoriel de Bartlomiej Filipek dont l'objectif est de vous apprendre à compacter des valeurs booléennes.

    « J’ai commencé la rédaction de ce billet, car j’ai rencontré un problème similaire dans le cadre de mon travail il y a quelques temps. Le code d’une zone de notre système compactait des résultats booléens de conditions en bits. Je me demandais s'il était possible d’optimiser ce processus. Cet algorithme n’est pas des plus complexes, mais comme à l’accoutumée, il ouvre la réflexion sur des détails et solutions intéressantes. Alors j’ai décidé de partager cette réflexion avec mes lecteurs. »

    Bonne lecture .

    Retrouvez les meilleurs cours et tutoriels pour apprendre la programmation C++
    Pour contacter les différents services du club (publications, partenariats, publicité, ...) : Contacts

  2. #2
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Comme souligné dans l'article, std::vector<bool> est sensé être "compacté". C'est toujours bon à prendre dans de nombreux cas (même si pas recommandé à cause de défauts dont il faut être conscient).

    Ceci me rappelle qu'il y a une bonne 20aine d'années j'avais implémenté un tableau dynamique de bits. Je ne l'ai plus utilisé depuis 15 ans...

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Par défaut
    Merci pour ce tutoriel très bien expliqué.

    J'ai cependant une petite question: à quoi sert cette ligne (paragraphe IX)?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const int64_t lenDivBy8 = (arrayLength / 8) * 8;
    Si on divise par 8 puis multiplie par 8 ensuite, un nombre entier, on n'est pas sensé obtenir la même chose?

  4. #4
    Membre éclairé Avatar de dorian833
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 223
    Par défaut
    En fait non, pas forcément car c'est une division entière. En gros, le code permet d'avoir la valeur de 'arrayLength' arrondie au multiple de 8 directement égal ou inférieur.

    Par exemple pour 'arrayLength = 32' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    arrayLength / 8 = 4
    (arrayLength / 8) * 8 = 32
    Le résultat est effectivement identique.

    Par contre, si l'on prend 'arrayLength = 34' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    arrayLength / 8 = 4
    (arrayLength / 8) * 8 = 32
    C'est ici que l'on se rend compte de l'intérêt d'une telle ligne.

    On rencontre souvent du code assez proche pour calculer le stride d'une image.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Par contre je ferais attention à ce genre de code.
    J'ai implémenté un système similaire, et avec des calculs de ce genre le compilateur les optimisait en release ce qui donnait des résultats incorrects..
    Après c'était sur des constexpr et non des variables, peut-être que ça importe.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Ceci est tellement plus direct
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const int64_t lenDivBy8 = arrayLength & ~7;
    Sauf que, ~7 est-il 32 ou 64 bits ? Telle est la question...

  7. #7
    Membre à l'essai
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Août 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 6
    Par défaut
    Citation Envoyé par darkman19320 Voir le message
    Merci pour ce tutoriel très bien expliqué.

    J'ai cependant une petite question: à quoi sert cette ligne (paragraphe IX)?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const int64_t lenDivBy8 = (arrayLength / 8) * 8;
    Si on divise par 8 puis multiplie par 8 ensuite, un nombre entier, on n'est pas sensé obtenir la même chose?
    En fait la formule exacte pour trouver la longueur du tableau compacté est

    par exemple si arrayLength = 15, il faut deux octets et arrayLength+7 = 22, qui divisé par 8 (division entière) donne 2

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/09/2018, 00h52
  2. Tutoriel pour apprendre à écrire des tests unitaires pour des applications React
    Par Community Management dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 10/02/2017, 09h48
  3. Réponses: 1
    Dernier message: 27/07/2016, 15h57
  4. Réponses: 0
    Dernier message: 07/07/2016, 10h00

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