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 :

Accès au Iième bit d'un entier


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 16
    Points : 14
    Points
    14
    Par défaut Accès au Iième bit d'un entier
    Bonjour à tous,

    Je travaille actuellement sur un projet dont l'explication détaillée ne sera pas utile ici pour comprendre le problème, ceci je vais tout de même préciser d'avantage le contexte :

    1/ Nous avons à faire à des ensembles dont les éléments varient entre 1 et 32, ainsi, aucun ensemble ne possèdera la valeur 33 ou 45 ou 0.

    2/ Un ensemble possède un nom d'au plus une lettre, non case sensitive ainsi, l'ensemble 'A' contient les mêmes éléments que l'ensemble 'a'.

    3/ QQs exemples :
    A = { 3, 23 }
    b = { }
    c = {10, 9, 8, 6 }
    etc.

    Je dois retenir quel éléments appartiennent à quel ensemble pour que dans la suite, je puisse faire des opération tel que l'union, l'intersection etc. entre les ensembles.
    Le type int en C étant codé sur 32 bits (exactement la valeur max d'un élément de l'ensemble), j'ai décidé de représenter ceci sous forme d'un tableau de 26 entiers (26 lettres possibles => 26 cases dans le tableau ).

    Ainsi, je voudrais au final utiliser le contenu de mes cases (de types entier) en tant que booléen. Je m'explique, si la valeur 25 est affecté à l'ensemble 'A', je voudrais positionner le bit numéro 25 de la première case du tableau à 1 etc.

    Exemple

    Etat Initial :
    Case 1 du tableau (lettre A) = 00000000000000000000000000000000
    Case 2 du tableau (lettre B) = 00000000000000000000000000000000
    .
    .
    .

    a = { 3, 12 } => on transforme le bit 2 et 12 dans la case A du tableau et on obtient :
    Case 2 du tableau (lettre B) = 00000000000000000000100000000100
    .
    .
    .

    Le problème, c'est que je ne sais pas du tout comment accéder au Iième bit d'un entier =/

    Quelqu'un peut il m'aider ?

    Merci à vous =)

  2. #2
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Bonjour,

    Pour faire ce que tu souhaites, il te faut utiliser les opérateurs sur les bits :
    • & (ET)
    • &= (idem avec affectation)
    • | (OU)
    • |= (idem avec affectation)
    • << (décalage à gauche)
    • >> (décalage à droite)
    • etc.


    Quelques petits exemples :
    • 1 << 2 == 4 == 00000100
    • 9 | 2 == 11 == 00001001 | 00000010 == 00001011
    • 10 & 4 == 0 == 00001010 & 00000100 == 00000000
    • 12 & 4 == 4 == 00001100 & 00000100 == 00000100


    Je te laisse un peu te renseigner dessus, et si tu ne vois toujours pas comment les utiliser, reviens poster ici.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 16
    Points : 14
    Points
    14
    Par défaut
    Merci pour ta réponse,

    J'ai finalement résolu le soucis.
    J'ai tout simplement utilisé la fonction puissance ( pow ).
    Ainsi si je veux que le bit i de mon entier soit à 1 j'affecte à celui ci la valeur de pow(2, i).

    A bientôt =)

  4. #4
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    La fonction pow fait des calculs sur des nombres flottants, et tu veux des nombres entiers.
    Le mieux est encore de faire ta propre fonction (ou éventuellement macro) qui fait un décalage de bits.
    Pour mettre le bit i à 1 (en considérant que le premier bit est le bit 0) il suffit de faire 1 << i.
    Ensuite pour 'l'ajouter' à ton nombre, tu fais nb | (1 << i), le tour est joué.
    Plus tu pédales moins fort, moins t'avances plus vite.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Attention, un int ne fait pas forcément 32 bits. Ton programme risque de ne pas être portable.

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

Discussions similaires

  1. Inverser les bits d'un entier (mirroir)
    Par Raikyn dans le forum Débuter
    Réponses: 8
    Dernier message: 04/03/2012, 14h08
  2. Modifier les bits d'un entier
    Par JLC83 dans le forum Langage
    Réponses: 2
    Dernier message: 13/01/2010, 18h18
  3. Manipulation d'un bit sur un entier
    Par SybVicious dans le forum Débuter
    Réponses: 20
    Dernier message: 30/07/2007, 23h31
  4. Entier : accès bit à bit
    Par slylafone dans le forum C++Builder
    Réponses: 16
    Dernier message: 14/06/2005, 20h34
  5. [8086] Affichage d'un entier de 32 bits
    Par elNINIo dans le forum Assembleur
    Réponses: 12
    Dernier message: 10/05/2003, 20h33

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