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 :

variable représentée par un bit


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Cycles en Informatique
    Inscrit en
    Juin 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Cycles en Informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2007
    Messages : 67
    Points : 51
    Points
    51
    Par défaut variable représentée par un bit
    Bonjour,

    Est ce quelqu'un a une idée de comment déclarer et manipuler une variable qui est sur un seul bit.

    Je vous remercie d'avance.

  2. #2
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    Rien de standard. Ce que tu peux faire, c'est utiliser les opérateurs de bit et traiter un char, int, ou c'que tu veux comme un ensemble de bit dont la valeur en tant qu'ensemble ne veut rien dire.

    Tu peux par exemple considérer que char c'est 8 variables de 1 bit, ou que short c'est 16 variables de 1 bit, etc...

    Après, tu peux utiliser les opérateurs <<, & et | pour récupérer leur contenu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
     
    void set_bit( int* bitset32, char bit )
    {
    	*bitset32 |= ( 1 << bit );
    }
     
    bool is_set( int* bitset32, char bit )
    {
    	return *bitset32 & ( 1 << bit );
    }
     
    void unset_bit( int* bitset32, char bit )
    {
    	if( is_set( bitset32, bit ) )
    		*bitset32 -= ( 1 << bit );
    }
     
    int main()
    {
    	int bitset = 0;
    	set_bit( &bitset, 0 );
    	printf("%d\n", is_set( &bitset, 0 ) );
    	printf("%d\n", is_set( &bitset, 1 ) );
    	unset_bit( &bitset, 0 );
    	printf("%d\n", is_set( &bitset, 0 ) );
    	return 0;
    }

  3. #3
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    ou bien manipuler un champ de bit dans une structure

    exemple unsigned 32 ou chaque bit est accessible, ensuite il faut faire des manipulations comme celle indiqué par julien du sud:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    struct bytefield32  {
         unsigned bt0:1;
         unsigned bt1:1;
         unsigned bt2:1;
         unsigned bt3:1;
         unsigned bt4:1;
         unsigned bt5:1;
         unsigned bt6:1;
         unsigned bt7:1;
         unsigned bt8:1;
         unsigned bt9:1;
         unsigned bt10:1;
         unsigned bt11:1;
         unsigned bt12:1;
         unsigned bt13:1;
         unsigned bt14:1;
         unsigned bt15:1;
         unsigned bt16:1;
         unsigned bt17:1;
         unsigned bt18:1;
         unsigned bt19:1;
         unsigned bt20:1;
         unsigned bt21:1;
         unsigned bt22:1;
         unsigned bt23:1;
         unsigned bt24:1;
         unsigned bt25:1;
         unsigned bt26:1;
         unsigned bt27:1;
         unsigned bt28:1;
         unsigned bt29:1;
         unsigned bt30:1;
         unsigned bt31:1;
     
    };
    quelques informations complémentaires ici
    http://www.technoplaza.net/programming/lesson8.php
    http://msdn.microsoft.com/en-us/libr...xh(VS.80).aspx
    http://stackoverflow.com/questions/1...ipulation-in-c
    http://www.pagetable.com/?p=250
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Attention cependant pour le retour de la fonction is_set, le type bool n'existe qu'en C99 sinon, il faut le remplacer par un type int
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    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 : 38
    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
    Tu peux par exemple considérer que char c'est 8 variables de 1 bit, ou que short c'est 16 variables de 1 bit, etc...
    Attention, un char ne fait pas toujours 8 bits. Pour savoir ce qu'il en est en pratique, il faut consulter la constante CHAR_BIT définie dans <limits.h>

  6. #6
    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
    Citation Envoyé par PRomu@ld Voir le message
    Attention, un char ne fait pas toujours 8 bits. Pour savoir ce qu'il en est en pratique, il faut consulter la constante CHAR_BIT définie dans <limits.h>
    Non effectivement un char ne fait pas toujours exactement 8 bits mais il fait obligatoirement au moins 8 bits.

    N'utiliser que 8 bits (et utiliser explicitement des unsigned char et non des char) permet donc d'être portable au prix d'un petit "gaspillage" de mémoire sur les rares plateformes où un char représente plus de 8 bits.

  7. #7
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Goe,
    Citation Envoyé par gl Voir le message
    Non effectivement un char ne fait pas toujours exactement 8 bits mais il fait obligatoirement au moins 8 bits.

    N'utiliser que 8 bits (et utiliser explicitement des unsigned char et non des char) permet donc d'être portable.
    Pas forcément.

    Ça peut par exemple changer l'alignement dans une structure ...
    Si les cons volaient, il ferait nuit à midi.

  8. #8
    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
    Citation Envoyé par droggo Voir le message
    Ça peut par exemple changer l'alignement dans une structure ...
    Dans le cas présent, il n'est pas question de structure.

    En outre, mis à part quelques cas assez spécifiques pour lesquels la portabilité n'est généralement pas la préoccupation première, l'alignement dans les structures ne nuit pas réellement à la portabilité.
    A moins bien sur d'utiliser des constructions discutables [1] (comme mapper directement une structure dans un flux ou dans un fichier) mais dans ce cas le problème n'est pas dans la perte de l'alignement mais dans la supposition erronée que la représentation serait la même partout.



    [1] Ce qui, au passage, ne signifie pas que le code soit mauvais. Parfois la portabilité n'est pas un critère attendu et de telles constructions peuvent avoir du sens. Il faut juste être conscient des limitations.

  9. #9
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Boe,
    Citation Envoyé par gl Voir le message
    Dans le cas présent, il n'est pas question de structure.

    En outre, mis à part quelques cas assez spécifiques pour lesquels la portabilité n'est généralement pas la préoccupation première, l'alignement dans les structures ne nuit pas réellement à la portabilité.
    A moins bien sur d'utiliser des constructions discutables [1] (comme mapper directement une structure dans un flux ou dans un fichier) mais dans ce cas le problème n'est pas dans la perte de l'alignement mais dans la supposition erronée que la représentation serait la même partout.



    [1] Ce qui, au passage, ne signifie pas que le code soit mauvais. Parfois la portabilité n'est pas un critère attendu et de telles constructions peuvent avoir du sens. Il faut juste être conscient des limitations.
    Je réagissais à l'affirmation que c'est portable, donc me dire que la portabilité n'est pas toujours un critère - ce qui est vrai - n'est pas recevable.
    Si les cons volaient, il ferait nuit à midi.

  10. #10
    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
    Citation Envoyé par droggo Voir le message
    Je réagissais à l'affirmation que c'est portable, donc me dire que la portabilité n'est pas toujours un critère - ce qui est vrai - n'est pas recevable.
    Non, ce n'est pas ce que j'ai voulu dire.

    Ce que je disais c'est que:
    • Se restreindre à la plage minimale garantie (et donc à la taille minimale) est portable.
    • L'alignement dans une structure n'a globalement, moyennant un minimum de travail et d'attention, pas d'impact sur la portabilité.


    Cependant, concernant le cas particulier de l'alignement des structures:
    • Parfois, pour différentes raisons, on ne cherche pas à faire dans le portable, bien que cela reste possible.
    • Enfin, il existe quelque cas extrêmes où il n'est tout simplement pas possible de faire portable.

  11. #11
    Membre du Club
    Homme Profil pro
    Cycles en Informatique
    Inscrit en
    Juin 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Cycles en Informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2007
    Messages : 67
    Points : 51
    Points
    51
    Par défaut
    Bonjour,

    Je remercie tous de vos réponse et de cette discusion enrichissante. Je vois plus claire maintenant.

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

Discussions similaires

  1. variable modifié par une session
    Par Mr Meuble dans le forum Langage
    Réponses: 3
    Dernier message: 08/08/2006, 14h15
  2. contenu d'une variable définit par une autre variable
    Par PuppeT mAsTer dans le forum Langage
    Réponses: 4
    Dernier message: 04/07/2006, 19h32
  3. [WinCE][CF 1.2/VB.net]variable visible par toute l'apli
    Par zitoun dans le forum Windows Mobile
    Réponses: 1
    Dernier message: 01/06/2006, 14h28
  4. Variable accessible par différentes classe
    Par jbidou88 dans le forum Langage
    Réponses: 6
    Dernier message: 03/05/2006, 10h27
  5. [Cookies] Variable envoyée par un formulaire
    Par mmz dans le forum Langage
    Réponses: 10
    Dernier message: 17/03/2006, 11h50

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