Comment afficher le code binaire d'un caractère en C++

Résolu
mrcobraxx - Modifié par cptpingu le 29/10/2014 à 15:57
 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'.

2 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 29/10/2014 à 16:35
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
2
un grand merci pour votre réponse aussi rapide et aussi clair !!!

votre explication ma été d'une grande aide.
0
Rejoignez-nous