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 :

"C" une question de programmation ..


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Par défaut "C" une question de programmation ..
    Salut,

    Je voudrais transformer un int genre 0xFF, en un mot binaire de 8 bits -> jusque la no soucis, mais je voudrais transformer ce mot binaire de 8 bits en 8 int ("0" ou "1")

    exemple de code :

    int i = 0;
    int b0,b1,b2,b3,b4,b5,b6,b7;

    i=0x81;
    b0= ?? ; // LSB
    b1=?? ;
    b2=?? ;
    b3=?? ;
    b4=?? ;
    b5=?? ;
    b6=?? ;
    b7=?? ; // MSB

    La solution qui m'est venue desuite a l'esprit, c'est de transformer d'abord en binaire, et de passer par un tableau de char, mais c'est trop long j'aurais voulu savoir si vous n'aviez pas une idée de commande plus rapide ..

    Merci ..

    Unlucky,

  2. #2
    Membre émérite 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
    Par défaut
    Ceci devrait faire l'affaire (non testé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    unsigned int i=0X81;
    unsigned int b[8];
    int n;
     
    for (n=0;n<8;++n) b[n]=i&(1U<<n)?1:0;
    Ou bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    unsigned int i=0X81;
    unsigned int b[8];
    int n;
     
    for (n=0;n<8;++n) b[n]=(i>>n)&0X1;

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Par défaut
    ok, mais mauvaise exemple avec 0x81, prenons 0x0F

    avec ta soluce 1 :

    LSB = 0;
    MSB = 1;

    ??

    et ta soluce 2 :

    MSB=0;
    LSB=1;

    autres question :

    1. ca signifie quoi "1U" .. ? " ?1:0 " ?
    2. quelle est la solution qui demande le moins de traitement (car mon Tcycle=1µs et mes µs sont comptéees)
    3. pourqoi fais tu un &0x1 .. ?

    Merci ..

  4. #4
    Membre émérite 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
    Par défaut
    Citation Envoyé par unluckymannn
    ok, mais mauvaise exemple avec 0x81, prenons 0x0F

    avec ta soluce 1 :

    LSB = 0;
    MSB = 1;

    ??

    et ta soluce 2 :

    MSB=0;
    LSB=1;
    Chez moi, les deux solutions donnent la même chose et c'est la bonne réponse. Faites voir votre code.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Par défaut
    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
     
     
    int RWTrameLanCByte(void){
    int i= 0x28;
    SignalLanCPin=i>>0;
    DelayBitLanC();
    //Delay10TCYx(9); //retard du a la soustraction
    SignalLanCPin=i>>1;
    DelayBitLanC();
    SignalLanCPin=i>>2;
    DelayBitLanC();
    SignalLanCPin=i>>3;
    DelayBitLanC();
    SignalLanCPin=i>>4;
    DelayBitLanC();
    SignalLanCPin=i>>5;
    DelayBitLanC();
    SignalLanCPin=i>>6;
    DelayBitLanC();
    SignalLanCPin=i>>7;
    DelayBitLanC();
    SignalLanCPin=1; //-> &logique pour laisser la ligne
    1

    a terme, je passe en parametre a la fonction un Byte ici "i "

    Pour info, je veux ecrire LSB first ..

  6. #6
    Membre émérite 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
    Par défaut
    1. 1U est une constante non signée (U pour unsigned)
    L'expression "x=cond?a:b;" équivaut à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (cond)
     x=a;
    else x=b;
    2. Je pense que la seconde solution est plus rapide, mais à vérifier. En outre, cela dépend des optimisations du compilateur. Et puis mes deux solutions ne sont peut-être pas les seules et il peut y avoir plus performant.

    3. Le "&0X1" sert à masquer tous les bits sauf celui de poids faible.

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

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