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 :

extraire le ieme bits d'un nombre


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Par défaut extraire le ieme bits d'un nombre
    dans mon programme je veux extraire le iéme bits d'un nombre avec i compris entre 1 et 8

    apres etre passé sur la FAQ j'ai trouvé
    #define SET(flag, bit) ((flag) |= (1 << (bit)))
    #define CLEAR(flag, bit) ((flag) &= ~(1 << (bit)))
    #define GET(flag, bit) ((flag) & (1 << (bit)))

    mais je sais pas du tout comment m'en servir

    si quelqu'un a des pistes??

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Par défaut
    euh j'ai oublié de vous dire que mon nombre est un int donc défini sur 8bits

  3. #3
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Bonjour,

    euh j'ai oublié de vous dire que mon nombre est un int donc défini sur 8bits
    ca c'est faux, les int ne sont pas défini sur 8 bit, meme les short sont plus gros.
    Mais si en revanche tu connais la taille sur la quelle est définie ton nombre, une solution peu jolie mais facile est de le convertir en binaire (tres facile) puis de prendre le bit qui t'intéresse.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    En mémoire le nombre est forcément en binaire.

    La taille des int dépend de la plate-forme, on ne peut rien affirmer quant à leur taille.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Au fait,

    pour avoir la taille de tes int, tu peux faire :

    sizeof(int)
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Ou plutôt sizeof(int)*CHAR_BIT pour avoir la taille en bits.

    mais je sais pas du tout comment m'en servir
    C'est pourtant on ne peut plus simple non ?
    uint8_t i;
    GET(i, 0) <-- le bit 0
    GET(i, 1) <-- le bit 1
    etc. jusqu'à 7.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par ToTo13
    Mais si en revanche tu connais la taille sur la quelle est définie ton nombre, une solution peu jolie mais facile est de le convertir en binaire (tres facile) puis de prendre le bit qui t'intéresse.
    Qu'est-ce qui raconte le titi ? Il a chopé la grippe aviaire ?


  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Par défaut
    eeeuh comment on transcrit un int en binaire??

    mon programme fonctionne de la maniere suivante:
    je reçois x et y qui sont 2 entiers.
    x permet de trouver la case d'un tableau d'entiers intitulé coding;
    avec à l'interieur de coding[x] des valeurs ascii comprise entre 0 et 255

    et y entier compris entre 1 et 8 qui permet de sélectionner le bit à lire à la case coding[x]

    je veux que mon programme me rende la valeurs binaire de ce yieme bits de coding[x]

    si quelqu'un sait comment le faire, parce que je m'arrache les cheveux dessus

  9. #9
    Membre confirmé Avatar de Kenji
    Inscrit en
    Janvier 2005
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Janvier 2005
    Messages : 129
    Par défaut
    J'espère que c'est ce que tu veux:

    Il suffit de faire un décalage et de faire un masque & 1

    Comme ceci pour le i eme bit

    (x >> (i - 1)) & 1 renvoit le i eme bit

    En espérant que ca réponde à ta question

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    [Pour une nouvelle question, on crée un nouveau topic...]
    Citation Envoyé par gronaze
    eeeuh comment on transcrit un int en binaire??
    Explique 'transcrit'.
    mon programme fonctionne de la maniere suivante:
    je reçois x et y qui sont 2 entiers.
    x permet de trouver la case d'un tableau d'entiers intitulé coding;
    Oui, on appelle ça un index... Il y a un minimum de vocabulaire à connaître dans ce métier...
    avec à l'interieur de coding[x] des valeurs ascii comprise entre 0 et 255

    et y entier compris entre 1 et 8 qui permet de sélectionner le bit à lire à la case coding[x]

    je veux que mon programme me rende la valeurs binaire de ce yieme bits de coding[x]
    Ouvre ton livre de C au chapitre 'opérateurs binaires' (bitwise operators) :
    Fait de ton mieux et poste ton code. Commence par des choses simples. Il faut un peu de temps pour maîtriser les opérateurs binaires

  11. #11
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut
    le principe est le suivant:

    tu as un nombre entier x. (pour faciliter l'exemple, je suppose les entiers codés sur 8 bits, mais en vérité ils le sont plus souvent sur 32).
    x vaut 20. Dans ta machine, il est codé en binaire:
    On va dire que les bits sont numérotés ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    76543210  <-- numeros de bits
    00010100  <-- ton nombre x=20
    si tu veux connaitre la valeur d'un bit, il faut en fait créer un nombre entier, qui vaudra 0 ou 1. donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    00000000
    ou
    00000001
    par conséquent, tu dois procéder en 2 étapes:
    1) "masquer" ton entier: tu mets TOUS les bits à 0 A l'EXCEPTION du bit qui t'interesse (pour exemple, je veut connaitre la valeur du bit numéro 2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    avant masquage:
    x: 00010100
    apres masquage:
    x: 00000100
     
    on a fait un masque:
    00010100 <- ton nombre
    00000100 <- masque pour observer le bit numero 2
    00000100 <- nobre obtenu apres le masquage
    2) observer la valeur du résultat obtenu (en tant que nombre entier)
    ->si il vaut 0 (le nombre en binaire est 00000000), alors le bit observé vaut 0
    ->si il est différent de 0 (mais a n'importe quelle valeur), alors le bit vaut 1

    Comment masquer?
    Avec les opérateurs binaires dont Emmanuel Dalahaye t'as parlé. Plus précisément le & et le >>

    quel rapport avec:
    #define SET(flag, bit) ((flag) |= (1 << (bit)))
    #define CLEAR(flag, bit) ((flag) &= ~(1 << (bit)))
    #define GET(flag, bit) ((flag) & (1 << (bit)))

    et bien si tu observe bien, ces macros font justement des masquages et décalages.
    La macro GET en particulier:
    elle commence par créer un masque en décalant 00000001 vers la gauche de (bit) bits, et ensuite elle masque avec le nombre (flag)

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Par défaut
    merci biosox, j'ai bien compris.

    Par contre j'ai beau mettre promené sur des pages d'opérateurs binaires, j'ai pas trouvé comment partant d'une valeur par exemple
    int i=26;

    comment on transtype i en valeur binaire, soit pour notre exemple
    i deviendrait 11010;

    je précise je travaille en C (parce qu'a priori le C++ à l'aire plus simple pour ce genre d'opération)

    baptiste

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par gronaze
    Par contre j'ai beau mettre promené sur des pages d'opérateurs binaires, j'ai pas trouvé comment partant d'une valeur par exemple
    int i=26;

    comment on transtype i en valeur binaire, soit pour notre exemple
    i deviendrait 11010;
    Tu parles de représentation textuelle ? Il faut écrire la fonction toi même. Tu as tous les éléments.

    Je rappelle que la représentation interne d'une valeur numérique est déjà en binaire. Il suffit donc de tester chaque bit de cette valeur et d'afficher '0' ou '1' selon l'état...
    je précise je travaille en C (parce qu'a priori le C++ à l'aire plus simple pour ce genre d'opération)
    Ben tiens... T'as essayé ?

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Par défaut
    ok merci pour tout j'ai réussi

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

Discussions similaires

  1. Extraire la partie décimale d'un nombre
    Par Invité dans le forum Langage
    Réponses: 5
    Dernier message: 28/09/2016, 13h47
  2. inverser bits d'un nombre binaire
    Par jojo_ol76 dans le forum MATLAB
    Réponses: 7
    Dernier message: 09/11/2007, 10h05
  3. Algorithme nombre de bits d'un nombre décimal
    Par spy_k dans le forum Scheme
    Réponses: 7
    Dernier message: 25/10/2007, 13h53
  4. Affecter un bit dans un nombre
    Par tut dans le forum C++
    Réponses: 8
    Dernier message: 20/09/2007, 17h24
  5. Extraire la partie décimale d'un nombre
    Par Kant2006 dans le forum C++
    Réponses: 19
    Dernier message: 16/06/2006, 20h05

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