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 :

Représentation d'un entier en binaire dans un programme C++


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2011
    Messages : 26
    Points : 34
    Points
    34
    Par défaut Représentation d'un entier en binaire dans un programme C++
    Bonjour,

    Je suis en train de développer un programme en C++. Je dois représenter certaines données en binaire.
    J'ai une structure NoeudID qui contient 2 champs clID et indIPSimID en entier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct NoeudID //each of these fields is unique for a given node
    {
    string m_RTID;   // RTID du noeud 
    int* clID; // cluster ID du noeud: 0 si le noeud est réel; 1 sinon //même chose que sTs
    int* indIPSimID; // IP adresse du noeud si c'est un noeud réel ou l'ID de simulation si c'est noeud virtuel
    };
    J'aimerais représenter ces deux champs clID et indIPSimID en binaire sur 32 bits: clID sur 4 bits et indIPSimID sur 28 bits. Alors, j'ai créer une fonction de conversion qui prend en entrée l'entier à convertir et le nombre de bits sur lequel il faut faire la conversion. Voici la fonction:
    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
     
    /* la fonction de conversion d'un entier en binaire
     * nbr est l'entier à convertir et nBits est le nombre bits du binaire*/
     int* Noeud::binaire(int nbr, int nBits){
    	  int *tab = new int[nBits];
        int i= nBits-1;
        int k=0;
        do{
        	tab[i]=nbr%2;
        	nbr=nbr/2;
        	i--;
        	k++;
        }
        while(nbr!=0);
        for(int j = 0; j < nBits - k; j++)
            tab[j] = 0;
     
        return tab;
      }
    Ensuite, pour faire la représentation des champs en binaire, j'appelle cette fonction binaire; par exemple:
    N.m_NoeudID.clID = N.binaire(0, 4);
    N.m_NoeudID.indIPSimID = N.binaire(1, 28);
    N étant une instance d'une classe Toto dans laquelle est définie la fonction binaire. m_NoeudID est un attribut de cette classe.

    J'aimerais savoir si cette façon de faire est correcte.

    Un ami m'a proposé ce qui suit:

    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
     int zip32bits(char *v)
    {
    	return ( v[0] | (v[1] << 4 ));
    }
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int zip =-1;
    	char v[2] = {12, 345};
     
                 cout <<"original values:  "<<v[0]<<" -- "<<v[1]<<endl;
     
    	zip = zip32bits(v);
     
    	cout<< "zipped value:  "<<zip<<endl;
     
    	return 0;
    }
    Mais, je ne suis pas convaincu de cette proposition.

    Ma question est sur trois volets:
    1. Est-ce que ce j'ai fait est coorect?
    2. Est-ce que ce que la proposition de l'ami est correcte?
    3. Est-ce qu'il y une autre façon de faire cette représentation?

    Merci d'avance.

  2. #2
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par seco102 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int zip32bits(char *v)
    {
       return ( v[0] | (v[1] << 4 ));
    }
    Hello,

    Cette fonction, me semble à première vue erronée, je pense qu'il devrait y avoir un décalage de 8 bits (1 octet) et non 4 bits.

    Sinon pour la représentation binaire, les std::bitset sont généralement bien utile.

    edit: pour cette fonction, il faut caster le char en int avant de faire le décalage, sinon tu obtiendra 0 (un char ne contenant que 8 bits, si tu décale de 8 bits à gauche, il reste que des 0), il est aussi préférable de travailler avec des unsigned (char et int) pour éviter les problèmes bizarres venant des décalages de bits sur les valeurs négatives.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2011
    Messages : 26
    Points : 34
    Points
    34
    Par défaut
    Bonjour Iradrille,

    Merci bien. Je vais consulter les std::bitset.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 10/02/2010, 06h52
  2. Représenter un binaire dans un xml
    Par bellemlih dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 07/07/2009, 12h26
  3. [WD9] Ecriture de valeur BINAIRE dans la base registre
    Par le y@m's dans le forum WinDev
    Réponses: 4
    Dernier message: 01/09/2005, 15h07
  4. Réponses: 11
    Dernier message: 13/10/2004, 00h58
  5. Affichage d'entiers en binaire.
    Par Tifauv' dans le forum C
    Réponses: 4
    Dernier message: 08/12/2003, 20h54

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