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 :

Manipulation d'un bit sur un entier [Débutant(e)]


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 42
    Points : 31
    Points
    31
    Par défaut Manipulation d'un bit sur un entier
    Bonjour!!!
    encore une petite question pour la route tant que je suis sur ma lancée

    en fait, je souhaiterai manipuler un bit particulier d'un entier sur 16 bits.
    par exemple, admettons le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uint16 entier = 0000 1010 1100 0110
    je souhaiterais pouvoir faire quelquechose de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (bit en gras de l'entier sur 16 bit = 1)
    {
    instruction
    }
    j'ai essayer avec les decalage de bits, mais ils ne me permettent pas d'acceder a un bit en particulier
    existe t-il un procédé?
    merci encore pour votre aide si précieuse!!!

  2. #2
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    On peut utiliser des masques. Par exemple, pour effectuer une action en fonction de la valeur du troisième bit de poids faible de i:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (i & 0x4)
     ...
    else
     ...

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 42
    Points : 31
    Points
    31
    Par défaut
    merci stephl ms je ne comprends pas tres bien la commande

    (i & 0x4)

    je ne vois pas comment je peux agir selon la valeur du 3e bit
    pourrais-tu me donner des precisions?
    merci d'avance

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Il faut que tu penses en binaire.
    L'opérateur & fait un ET binaire entre deux arguments.
    Donc, pour l'exemple, 4 en binaire vaut 0000 0100. On ne fait donc un ET qu'avec le 3ème bit. Tu n'agis donc que selon la valeur du 3ème bit.

  5. #5
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Citation Envoyé par SybVicious
    merci stephl ms je ne comprends pas tres bien la commande

    (i & 0x4)

    je ne vois pas comment je peux agir selon la valeur du 3e bit
    pourrais-tu me donner des precisions?
    merci d'avance
    Il s'agit juste d'un ET bit à bit. Par exemple, si i vaut 20, voici ce qui se passe au niveau des bits en considérant juste l'octet de poids faible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    i:	00010100
    masque:	00000100
    ET:	00000100

  6. #6
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 42
    Points : 31
    Points
    31
    Par défaut
    ok je commence a voir, merci.
    par contre derniere question, si i vaut 16 j'aurai alors

    i: 00010000
    masque: 00000100
    ET: 00000100

    si je veux travailler sur le 3e bit qui vaut 0 (je ne suis pas censé connaitre sa valeur) si je fais un ET avec 0x4 comme dans le code ci dessus, sa valeur ne sera t elle pas affectée?

  7. #7
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 42
    Points : 31
    Points
    31
    Par défaut
    petite correction, je me suis trompé, je confondais en croyant que 0 '&' 1 était égal à 1, tout est plus clair!
    merci beaucoup!!!

  8. #8
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    i: 00010000
    masque: 00000100
    ET: 00000000
    commence par:
    http://fr.wikipedia.org/wiki/Fonction_ET
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  9. #9
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Citation Envoyé par SybVicious
    ok je commence a voir, merci.
    par contre derniere question, si i vaut 16 j'aurai alors

    i: 00010000
    masque: 00000100
    ET: 00000100

    si je veux travailler sur le 3e bit qui vaut 0 (je ne suis pas censé connaitre sa valeur) si je fais un ET avec 0x4 comme dans le code ci dessus, sa valeur ne sera t elle pas affectée?
    Le ET bit-à-bit n'affecte en rien la valeur des variables utilisées dans le calcul. Avec i=16 et le masque 0x4, le résultat est 0 ce qui indique que le troisième bit de poids faible de i est à zéro.

  10. #10
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 42
    Points : 31
    Points
    31
    Par défaut
    merci infiniment de votre aide, je vais pouvoir desormais manipuler mes bits un par un!!
    cependant, est-ce que je peux utiliser un masque si je veux travailler sur 2 bits ou plus en particulier? par exemple :

    i = 00010100

    si je ve travailler sur la valeur des 3 bits en gras, est-ce que je peux utiliser le masque suivant ?

    masque = 00011100

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    308
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 308
    Points : 373
    Points
    373
    Par défaut
    Bah il faut que tu fasses le masque approprié, imaginons que tu veuilles manipuler les bits de poids faible 2 et 3, le masque sera 0x6 (0000 0110).

    Mais si tes groupes de bits sont toujours les mêmes, tu peux toujours te tourner vers les champs de bits grâce aux structures :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct maStruct {
        unsigned invisible:1; // signifie que la champ n'aura qu'un seul bit
        unsigned ouvert:1;
        unsigned codeErreur:3; // signifie qu'il en aura 3
        unsigned numeroDeSerie:11;
    } Etats;
    Ici l'addition des 4 champs fait 16 bits donc la structure finale fera 16 bits, en théorie si tu ne donne pas un multiple de 8 (1 octets) le compilateur arrondira à un multiple de 8 supérieur et ajoutera donc des bits inutilisés. Tu peux les ajouter toi pour connaître leur position exacte. Tu peux faire plein de combinaisons grâce à ces champs de bits, par contre il faut faire attention, selon le processeur que tu as (big endian, little endian) l'ordre des bits est inversé...

    Après pour accéder à un champ, c'est simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Etats var = nombre;
    if(Etat.ouvert)...

  12. #12
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 42
    Points : 31
    Points
    31
    Par défaut
    merci pshychoH13, ms justement mes groupes de bits ne sont pas toujours les memes mais c'est quand meme bon à savoir
    en tout cas merci à tous de votre aide!!!

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    308
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 308
    Points : 373
    Points
    373
    Par défaut
    Ils changent systématiquement ou alors il y a de motifs récurrents ??

  14. #14
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 42
    Points : 31
    Points
    31
    Par défaut
    Ben en fait je manipule 96 bits qui sont séparés en un tableau d'entiers sur 16 bits composés de 6 éléments. Chaque bit ou groupe de bits correspondent à un état particulier que je manipule et qui varie selon un facteur bien particulier. Par conséquent les motifs sont amenés à varier tres souvent

  15. #15
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Points : 683
    Points
    683
    Par défaut
    Ca m'interesse ce système de structure => dans mon problème :

    2. Implantation des ensembles

    On représente en mémoire tout ensemble e comme un entier naturel écrit en binaire b26...b2,b1, ou bk est le chiffre binaire 1 si la lettre rang k est dans e, et 0 sinon. Le chiffre b1 est le bit de poids faible et b26 celui de poids fort.
    Ecrire la représentation binaire de l'ensemble e1 pris en exemple dans 1., et sa valeur en décimal.

    Déclarer en C le type des ensembles pour cette représentation. Programmer en C très simplement les fonctions rang et lettre, en se rappelant que, en C, tout caractère est assimilé à son codage en entier.

    Programmer en C toutes les opérations de la question 1., en passant pour i, app, card et d par des fonctions auxiliaires appelées i1, app1, card1 et d1, où l'argument caractère est remplacé par son rang. Ces dernières fonctions sont à programmer récursivement, en même temps sur l'ensemble et sur le rang. On pourra à cet effet utiliser des quotients et restes de divisions entières par 2.

    Je peux faire une structure du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    typedef struct maStruct {
    	unsigned int ensemble:26;
    }Ens;
    Je sais que ca compile j'ai essayé mais je voulais savoir si ca faisait bien d'ensemble un entier de 26 bits ??

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    308
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 308
    Points : 373
    Points
    373
    Par défaut
    Le truc c'est que si tu n'as qu'un seul champ ça ne vaut pas vraiment le coup de faire une structure... Le problème avec ce système c'est que ta structure fera quand même 32 bits parce que le compilateur arrondi toujours... Mais tu ne pourras utiliser que 26 bits. Et le problème qui personnellement me ferait chier, c'est que pour modifier la valeur de ce truc tu devras obligatoirement utiliser l'opérateur de déréférencement d'attribut : -> ou .
    Les champs de bits valent le coup lorsque tu as plusieurs champs de taille différentes que tu dois réunir.
    Dans ton cas il serait préférable, je pense, mais tu fais ce que tu veux, d'utiliser un masque à chaque fois que tu manipules une valeur, un masque en hexa par exemple dans ton cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define MON_MASQUE 0x3FFFFFF
    après à chaque fois que tu as un nombre tu le masque avec l'opérateur bit-à-bit & :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monNombre = MON_MASQUE & valeur;
    Mais comme il semblerait que tu aies bel et bien besoin d'une structure pour ton exercice, alors oui le champs de bits tel que tu le déclares est valable. Mais comme j'ai pas la question 1 de ton exercice je peux pas plus t'aider...

  17. #17
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Points : 683
    Points
    683
    Par défaut
    Voici le numéro 1 :

    1. Spécification des ensembles

    Ecrire un module de spéc ENSEMBLE pour la sorte Ens des ensembles de caractères pris uniquement dans l'alphabet des 26 lettres majuscules romaines de 'A' à 'Z', avec les constructeurs de base :

    - v : ensemble vide;
    - i : tel que i(e,x) est l'insertion dans l'ensemble e de la lettre désignée par x;

    Donnez l'expression de construction avec v et i de l'ensemble e1 contenant exactement les lettres 'B', 'C', 'G'.

    Dans ENSEMBLE, définir par rapport à v et i les fonctions :

    - estv, telle que estv(e) retourne vrai si et seulement l'ensemble e est vide;
    - app, telle que app(e,z) est vrai si et seulement si la lettre z est dans l'ensemble e;
    - card, telle que card(e) est le cardinal de l'ensemble e;
    - d, telle que d(e,z) efface la lettre z de l'ensemble e;

    Spécifier également la fonction rang fournissant le rang d'une lettre dans l'alphabet, et la fonction lettre faisant l'inverse.

    On écrira soigneusement les préconditions nécessaires, en utilisant la comparaison <= entre les caractères supposée connue, et des constantes notées entre deux '.

    En fait, la structure n'est pas obligatoire me semble t'il donc ton idée de faire un masque (define) et de le manipuler est une très bonne idée et j'avais commencé comme ca. Mais quand j'ai vu ton système de structure, ca m'intéressais grandement et je connaissais pas trop : j'ai jamais trop fait de chose bit à bit en fait.

  18. #18
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Points : 683
    Points
    683
    Par défaut
    Je viens de voir que dans mon bouquin de C, il parlait des champs de bits mais vers la fin donc comme je suis en train de le lire j'y étais pas encore mais je regarderais ca tranquillement.

  19. #19
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Points : 683
    Points
    683
    Par défaut
    @PsychoH13 : Je viens de réagir sur le fait qu'il faut que je programme ce truc par récursivité donc pour la fonction i par exemple qui insert dans l'ensemble e une lettre, il faut passer par une fonction i1 intermédiaire...

    je vois pas trop comment faire : d'après ce que je comprend j'appelle la fonction i qui va appeler dans un premier temps la fonction rang pour obtenir le rang de la lettre et après on appelle la fonction i1 qui va modifier le bit de rang k (rang de la lettre) de façon récursive... je vois pas comment faire cela exactement.
    Tu as une idée judicieuse à me proposer ou quelqu'un d'autre, je suis pas sectaire lol

  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 PsychoH13
    Mais si tes groupes de bits sont toujours les mêmes, tu peux toujours te tourner vers les champs de bits grâce aux structures :
    Non, ce n'est pas du tout portable. Seules les opération bits à bits sont portables.

    http://emmanuel-delahaye.developpez....s.htm#bitfield
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. Addition d'entier signé sur 64 bits sur un proc 32 bits
    Par SoJaS dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 10/08/2010, 07h22
  2. Réponses: 2
    Dernier message: 27/02/2006, 09h40
  3. [C#] manipulation d'un pointeur sur un entier
    Par gmonta dans le forum Windows Forms
    Réponses: 7
    Dernier message: 17/01/2006, 19h09
  4. Décalage de bit sur unsigned char [8]
    Par dboulange dans le forum C++
    Réponses: 14
    Dernier message: 26/07/2005, 14h10
  5. [DB2] LIKE sur des entiers
    Par heloise dans le forum DB2
    Réponses: 1
    Dernier message: 07/10/2004, 23h30

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