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 des nombres en binaire


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2012
    Messages : 2
    Points : 3
    Points
    3
    Par défaut représentation des nombres en binaire
    Bonjour à tous mon programme ci-dessus permet d'afficher les nombres pairs compris entre -150 et 150, je souhaite aussi faire afficher ces nombres en binaire,
    je sais pas comment faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include<iostream.h>
    using namespace std;
     
    int main()
     
     {  
          int i;
          for (i=-150; i<150; i=i+2)
         printf("La valeur de i est : %d\n",i);
        printf("La valeur finale de i est : %d\n",i);
        for(;;);
             }

  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
    Hello,

    Evite printf en c++ et utilise std::cout
    Sinon pour ton problème un std::bitset fera l'affaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <iostream>
    #include <bitset>
     
    int main(int argc, char** argv) {
     
    	std::bitset<sizeof(int) * 8> bits;
     
    	for(int i=0; i<10; ++i) {
    		bits = i;
     
    		std::cout << i << ": " << bits << std::endl;
    	}
    	return 0;
    }

  3. #3
    Membre actif
    Avatar de EtherOS
    Homme Profil pro
    Etudiant Polytechnicien
    Inscrit en
    Juillet 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Etudiant Polytechnicien
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 58
    Points : 233
    Points
    233
    Par défaut juste une proposition
    la fonction itoa peut te convertir ces nombres en binaire :

    soit :
    i l'entier en base 10 qu'il faut convertir en binaire

    str la chaine qui va contenir la convertion de i en base 2 .

    2 la base de sortie du string

    str est de type char*

    pour convetir char * en std::string faire:

    puis afficher le str:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout << s<<std::endl;
    Pour gérer les nombres négatifs faire un complément à 1 des bits de sortie du string.
    a + opp(a) = 1

    pour pos allant de 1 à s.size();

    par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout  << 1-atoi(s.substr(pos,1)) << std::endl;

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 264
    Points : 725
    Points
    725
    Par défaut
    itoa n'est pas une fonction standard et n'est présente que sur certains systèmes. Il vaut mieux éviter de l'utiliser.

    Faire une fonction de conversion decimal-binaire à base de divisions successives par 2 n'est pas très compliqué. Voici des explications sur comment faire.
    "By and large I'm trying to minimize mentions of D in C++ contexts because it's as unfair as bringing a machine gun to a knife fight." - Andrei Alexandrescu

  5. #5
    Membre éprouvé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Points : 1 060
    Points
    1 060
    Par défaut
    Version crade, octet par octet à base de masque sur les bits (fonctionne pour int, float, double, unsigned int, etc...) :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    #include <iostream>
    #include <sstream>
    #include <string>
    #include <algorithm>
    #include <limits>
     
    template < typename T >
    std::string to_binary( const T& value ){
            // Masques pour 8 bits.
    	static unsigned char flags[] = {
    		0x01, //00000001
    		0x02, //00000010
    		0x04, //00000100
    		0x08, //...
    		0x10,
    		0x20,
    		0x40,
    		0x80
    	} ;
     
    	const unsigned char* buffer = reinterpret_cast< const unsigned char* >( &value ) ; 
    	// pour chaque octet, on applique les masques
    	std::ostringstream oss ;
    	for ( int i = 0; i < sizeof(value); i++ ){
    		for ( int j = 0; j < 8; j++ ){
    			oss << ( ( buffer[i] & flags[j] ) ? 1 : 0 ) ;
    		}
    	}
     
    	std::string result = oss.str() ;
    	std::reverse( result.begin(), result.end() );
    	return result ; 
    }
     
    int main( int argc, char* argv[] ){
    	std::cout << to_binary( 12.0f ) << std::endl ;
            std::cout << to_binary( 12.0 ) << std::endl ;
            std::cout << to_binary( -4 ) << std::endl ;
            std::cout << to_binary( 4 ) << std::endl ;
    	return 0 ; 
    }

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Il existe de nombreux exemples sur le net à l'aide des opérateur & et >> (respectivement et binaire et décallage de bits).
    A la louche ça donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (int i = 0; i < sizeof(value); ++i)
    {
      if (value & (1<<i)) // i-ème bit à 1
      else // i-ème bit à 0
    }
    Après on peut imaginer des variantes, par exemple je viens d'imaginer qqch comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (; value; value>>=1)
    {
     if (value & 1) // premier bit à 1
     else // à 0
    }
    En 2mn de debuger tu devrais la mettre au point.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. Représentation des rationnels en binaire
    Par manu1818 dans le forum Débuter
    Réponses: 12
    Dernier message: 03/06/2014, 19h29
  2. représentation des nombres réels
    Par franck8 dans le forum C++
    Réponses: 1
    Dernier message: 30/12/2012, 15h58
  3. représentation des nombres a virgules fixe en systemC
    Par MohEllayali dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 10/03/2009, 22h50
  4. Réponses: 6
    Dernier message: 26/05/2008, 20h08
  5. Réponses: 1
    Dernier message: 11/09/2005, 02h04

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