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 :

Manipulations sur les bits


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2005
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 32
    Points : 22
    Points
    22
    Par défaut Manipulations sur les bits
    Salut tout le monde, je travaille sur l'optimisation d'un programme en language C. Pour une fonction donnée, je veux travailler sur un tableau de booléens (0 ou 1), c'est à dire qu'au lieu de creer un tableau d'entiers (qui me couterait cher en espace memoire puisque 1 entier = 2 octets), je veux créer un tableaux de booléens. Ainsi chaque case sera codée sur un bit, si ce bit est 0, alors l'etat sera faux, sinon l'etat sera vrai.
    Un grand Merci d'avance de bien vouloir m'aider !

  2. #2
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Et ?

    Pourquoi n'utilises-tu pas un simple 'int' ?

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2005
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 32
    Points : 22
    Points
    22
    Par défaut
    Je l'ai dejé expliqué dans mon premier post. Vu que je travaille sur l'optimisation de cet algorithme donc il faut reduire sa complexité spatiale (memoire) et temporelle (temps d'execution) et avec un simple int qui coute 2 octets par case, l'addition serait cher. La solution que j'ai trouvé est de travailler sur un bit vu que je n'utilise que les 0 et les 1 pour ce tableau. 1 case qui coute 1 bit <<< 1 case qui coute 2 octets.

  4. #4
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Un char occupe un octet, tu ne peux pas travailler au niveau bit en C, sauf si tu passes par une structure avec champs de bits, mais la manipulation n'est plus la même...
    Edit: Quelle est la contrainte mémoire ? Que dit le profiler ?

  5. #5
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par ThE_LaSt
    avec un simple int qui coute 2 octets par case
    En C la taille des types de base n'est pas défini, cela est vrai uniquement sur ta machine.

    Le plus petit type est le char qui est codé sur CHAR_BIT bits. Après tu peut utiliser les opérateurs de décalage de bits (<< et >>) pour sélectionner/modifier un bit mais ça risque de ralentir l'algorithme.

    Sinon en C99 le fichier d'en tête stdint.h définie deux nouveaux types qui pourraient t'interesser :
    int_fastN_t Entier rapide(*) signé d'au moins N (8, 16, 32 ou 64) bits
    uint_fastN_t Entier rapide(*) non signé d'au moins N (8, 16, 32 ou 64) bits

    * la taille est choisie afin d'augmenter la rapidité des opérations

  6. #6
    Membre à l'essai
    Inscrit en
    Octobre 2005
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 32
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par progman
    Un char occupe un octet, tu ne peux pas travailler au niveau bit en C, sauf si tu passes par une structure avec champs de bits, mais la manipulation n'est plus la même...
    Vous pouvez m'en dire un peu plus sur cette structure avec champs de bits S'il vous plaît ?

  7. #7
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Donc je repose ma question.
    Qu'est ce qui t'empeche de travailler sur un int ? (unsigned)

    En supposant que la taille d'un entier sur ta machine soit de 16 bits (c'est ce que tu sembles dire), tu as 16 bits de disponibles pour faire tes opérations. Après, ça dépend de la taille de ton tableau, et de la taille en mémoire de la représentation d'un entier (16, 32, ... bits).

    Bien entendu, ce genre de manipulation doit être mûrement réfléchie : on perd en portabilité....

  8. #8
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Citation Envoyé par ThE_LaSt
    Citation Envoyé par progman
    Un char occupe un octet, tu ne peux pas travailler au niveau bit en C, sauf si tu passes par une structure avec champs de bits, mais la manipulation n'est plus la même...
    Vous pouvez m'en dire un peu plus sur cette structure avec champs de bits S'il vous plaît ?
    Structure avec champs de bit: quand tu crees une structure, tu peux definir sur combien de bits sont codes chacun des champs.

    Ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct     bitfield_s
    {
      unsigned int  b : 16;
    }
    Ici b est code sur 16 bits.

    Si tu a besoin d'un champs de bits de taille fixe, cette solution peut convenir.

  9. #9
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Personnellement, j'opte pour les char, tu gagnes 1 octet par variable, c'est pas si mal.
    Maintenant, les champs de bits, le site de developpez propose des cours et tutoriels, logiquement en cherchant un peu (et google est aussi ton ami), on trouve :
    ftp://ftp2.developpez.be/developps/c/PolyC.pdf
    Page 56, mais tout est intéressant.
    C'est une introduction aux champs de bits, et il le rappelle, ce n'est pas portable, et pour moi, ce n'est pas LA solution.

  10. #10
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Pour une fonction donnée, je veux travailler sur un tableau de booléens (0 ou 1),
    Bon stdbool ne peut être pas t'aider (je ne sais pas comment ce tyoe est géré). Sinon, un champ de bit peut suffire, non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct champ
    {
         int val : 1;
    };
    Le seule problème que je vois c'est que ton compilateur va peut être te transformer ton champ de bit qui est théoriquement stoqué sur 1 bit en un octet voir même pus (je ne sais pas pourquoi mais il y de fortes chances pour que ça en occupe 4).

    Pour ton problème de base, utilises déjà un char, ça sera mieux qu'un int, mais je ne pense pas que tu gagne énormément comme celà. En fait, utilise un profiler pour voir là ou se situe le goulot d'étranglement de ton programme, ensuite, tu pourras voir les champs de bits.

  11. #11
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    ce n'est pas portable
    Ca a un rapport avec le big et little endian ou est-ce un tout autre probleme?

  12. #12
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    trouvé sur le net :

    Les champs de bits sont évalués de gauche à droite sur certaines machines et de droite à gauche sur d'autres. Ce type de données n'est donc pas portable.
    C'est donc bien un problème de little/big endian

  13. #13
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Entre autres choses, oui.
    De plus, chaque compilateur organise la mémoire un peu différement, et si tu as un champ de 3 bits, ça peut occuper un octet (contenant les 3 bits), ou 2 ou 4, tu n'en sais a priori rien.

  14. #14
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Merci de ces précisions.

  15. #15
    Membre à l'essai
    Inscrit en
    Octobre 2005
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 32
    Points : 22
    Points
    22
    Par défaut
    Un grand merci pour votre aide et toutes ces precisions. La solution avec les structures de bits m'ont seduit avant que vous ne me citiez leur inconveniants. Pour l'instant je vais prendre un char pour chaque cases du tableau. A votre avis, quel serait la solution finale à adopter car le temps joue contre moi ?
    Encore merci pour votre disponibilité...

  16. #16
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Et pourquoi ne pas, comme le suggere Pouic, travailler avec des unsigned int ?

    Dans un unsigned int, tu peux stocker (sur ta plateforme) 16 bits grace aux operateurs binaires & et |

    http://c.developpez.com/faq/c/?page=...TYPE_acces_bit

  17. #17
    Membre à l'essai
    Inscrit en
    Octobre 2005
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 32
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par gl
    Et pourquoi ne pas, comme le suggere Pouic, travailler avec des unsigned int ?

    Dans un unsigned int, tu peux stocker (sur ta plateforme) 16 bits grace aux operateurs binaires & et |

    http://c.developpez.com/faq/c/?page=...TYPE_acces_bit

    Merci beaucoup gl, je crois que je tiens ma solution. Mais si t'as le temps, accorde en moi un peu et explique moi mieux comment bien manipuler ces bits. Encore merci !

  18. #18
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    La solution dépend de tes propres choix : soit tu cherches la portabilité et donc tu utilises un char, sinon prend les champs de bits sachant qu'ils ne t'apporterons pas forcément un gain de performance (les champs seront surement alignés sur un octet et donc dans la plupart du temps sur un char)

  19. #19
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par ThE_LaSt
    Citation Envoyé par progman
    Un char occupe un octet, tu ne peux pas travailler au niveau bit en C, sauf si tu passes par une structure avec champs de bits, mais la manipulation n'est plus la même...
    Vous pouvez m'en dire un peu plus sur cette structure avec champs de bits S'il vous plaît ?
    Euh, as tu ouvert ton livre de C ?

    http://emmanuel-delahaye.developpez....s.htm#bitfield

  20. #20
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par progman
    Personnellement, j'opte pour les char, tu gagnes 1 octet par variable, c'est pas si mal.
    Sur un DSP Texas TMS320C54, les char faisant 16-bit, on ne va pas gagner grand chose. Se méfier des généralisations hatives.
    C'est une introduction aux champs de bits, et il le rappelle, ce n'est pas portable, et pour moi, ce n'est pas LA solution.
    Les champs de bits utilisés de manière appropriées (interne) sont tout à fait portables, au même titre que les structures. Ce qui n'est pas portable, c'est de s'en servir pour définir des interfaces matérielles ou réseau.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. operations sur les Bits "<<" ">>"
    Par chrix10.2 dans le forum Général Python
    Réponses: 3
    Dernier message: 03/09/2007, 14h11
  2. entiers 64 bits et operateurs sur les bits
    Par xantares dans le forum C
    Réponses: 9
    Dernier message: 25/03/2007, 17h23
  3. AND logique sur les bits
    Par edam dans le forum Bases de données
    Réponses: 4
    Dernier message: 24/02/2007, 19h26
  4. Réponses: 3
    Dernier message: 28/07/2006, 10h16
  5. opérations sur les bits d'un byte
    Par petitours dans le forum C++Builder
    Réponses: 4
    Dernier message: 10/02/2004, 20h42

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