Comment afficher le code binaire d'un caractère en C++ [Résolu]

mrcobraxx - 29 oct. 2014 à 13:11 - Dernière réponse :  mrcobraxx
- 29 oct. 2014 à 16:50
Bonjour,
je souhaite afficher le code binaire d'un caractère, j'ai essayer cette solution mais elle ne m'affiche que des 1.

string Byte::getStringValue()
 {
  string val("");

  for (int i = 0 ; i<=7 ; i++)
  {
   if ( (m_v && 1) == 1) 
   {
    val = "1"+val;
   }
   else
   {
    val = "0"+val;
   }
  }
  return val;
 }


pour info m_v et un attribut de type int qui est initialiser au caractère correspondant à 97 donc un 'a'.
Afficher la suite 

2 réponses

Répondre au sujet
cptpingu 3784 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 18 avril 2018 Dernière intervention - Modifié par cptpingu le 29/10/2014 à 16:35
+1
Utile
Bonjour.

Plusieurs choses:
- Merci d'utiliser les balises de code quand tu postes un code (je te les ai ajouté).
- Évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace

Ton souci se situe à deux endroits:
- Il faut utiliser & et non && (même si dans ce cas précis, ça ne changeait rien, je t'invite à rechercher la différence subtile entre ces deux opérateurs). Ça n'aurait pas fonctionné pour la "vraie" méthode ci-dessous, puisque tu n'aurais pas vérifié les bits un à un, mais simplement si les deux nombres était différents de 0...
- Il ne faut pas toujours comparer le (même) bit le plus faible (celui le plus à droite), mais le bit de la droite vers la gauche. C'est ça qu'il te manque.
Pour décaler un bit vers la gauche, on utilise l'opérateur "<<".

Ex:
10010 & (1 << 0), ce qui équivaut à 10010 & 00001 => 0
10010 & (1 << 1), ce qui équivaut à 10010 & 00010 => 1
10010 & (1 << 2), ce qui équivaut à 10010 & 00100 => 0
10010 & (1 << 3), ce qui équivaut à 10010 & 01000 => 0
10010 & (1 << 4), ce qui équivaut à 10010 & 10000 => 1

Tu peux donc utiliser la formule "m_v & (1 << i) == 1".

Toi tu faisais toujours: "10010 & 1" ce qui fait que tu avais tout le temps 0 ou tout le temps 1.

Ensuite, j'ai amélioré ton code en utilisant un string buffer. On évite de concaténer des string avec +, c'est assez inefficace, et ça prend plus de mémoire que prévu. On préfère utiliser un std::ostringstream pour cela.

Enfin, tu peux aussi utiliser une classe C++ pour faire ce travail pour toi: std::bitset.
Voici les méthodes ici:
#include <iostream>
#include <sstream>
#include <bitset>

std::string getBinaryFormat(char c)
{
  return std::bitset<8>(c).to_string();
}

std::string get(char m_v)
{
  std::ostringstream buff;
  for (int i = 7; i >= 0; --i)
    buff << ((m_v & (1 << i)) ? "1" : "0");
  return buff.str();
}

int main()
{
  std::cout << getBinaryFormat('a') << std::endl
            << get('a') << std::endl;

  return 0;
}



Améliorer votre expérience CodeS-SourceS avec ce plugin:
ttp://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cptpingu
mrcobraxx - 29 oct. 2014 à 16:50
0
Utile
un grand merci pour votre réponse aussi rapide et aussi clair !!!

votre explication ma été d'une grande aide.
Commenter la réponse de mrcobraxx

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.