2010-09-28 17 views
1

J'ai un devoir dans ma classe de programmation C++ pour écrire une fonction qui affiche la valeur binaire de la valeur d'une variable. Par exemple, si je mets une valeur de "a" à un caractère char, je devrais obtenir la valeur binaire de "a". Mon professeur C++ n'est pas le meilleur dans le monde et j'ai du mal à faire fonctionner mon code en utilisant les exemples cryptiques qu'il nous a donnés. En ce moment, mon code sort juste une valeur binaire de 11111111, peu importe ce que je l'ai défini aussi (à moins que sa valeur NULL, alors je reçois 00000000).Comment générer la valeur binaire d'une variable en C++

Voici mon code:

#include <iostream> 

#define useavalue 1 

using namespace std; 

void GiveMeTehBinary(char bin); 

    int main(){ 

    #ifdef useavalue 
    char b = 'a'; 
    #else 
    char b = '\0'; 
    #endif 

    GiveMeTehBinary(b); 

    system("pause"); 

    return 0; 

    } 

    void GiveMeTehBinary(char bin){ 

    long s; 

    for (int i = 0; i < 8; i++){ 

     s = bin >> i; 

     cout << s%2; 

     } 

     cout << endl << endl; 


    } 

Merci une tonne d'avance les gars. Vous êtes toujours extrêmement utile :)

Editer: Correction maintenant - merci beaucoup: D Le problème était que je ne stockais pas la valeur du décalage de bits. J'ai mis à jour le code à son état de fonctionnement ci-dessus.

+0

Nommez correctement vos fonctions et variables.Ce n'est peut-être pas important dans ce petit exemple, mais vous ne devriez pas prendre l'habitude de le faire. –

Répondre

6

Le compilateur devrait vous avertir de certaines instructions dans votre code qui n'ont aucun effet . Envisager

bin >> i; 

Cela ne fait rien, puisque vous ne stockez pas le résultat de cette opération n'importe où.

En outre, pourquoi avez-vous déclaré tehbinary en tant que tableau? Tout ce que vous utilisez est un élément (l'actuel). Il suffirait de stocker juste le bit courant.

Quelques autres:

  • NULL ne doivent être utilisés avec des valeurs de pointeur. Votre utilisation fonctionne mais ce n'est pas l'usage prévu. Ce que vous voulez vraiment, c'est un caractère nul, c'est-à-dire '\0'.
  • Veuillez utiliser de vrais noms descriptifs. Je me souviens très bien de l'utilisation de variables appelées tehdataz etc. mais cela rend le code difficile à lire et une fois que le code initial se déconnecte, c'est ennuyeux pour vous lorsque vous essayez de lire votre code et pour celui qui classe votre code. Le formatage correct du code aide à comprendre beaucoup: rendre l'indentation logique et cohérente.

Si vous utilisez g++, toujours passer les drapeaux du compilateur -Wall -Wextra pour obtenir des diagnostics utiles sur votre code.

+0

J'utilise cygwin et ce n'est pas le cas. Je vais essayer votre suggestion et voir comment ça se passe. Merci! – Tomoni

+0

Cela fonctionne parfaitement maintenant. Merci beaucoup :) – Tomoni

+1

@Tomoni: Si vous utilisez gcc, compilez en utilisant 'g ++ -Wall' pour obtenir des avertissements utiles. –

1

Essayez ceci:

#include <bitset> 
#include <iostream> 
int main() 
{ 
    std::bitset<8>  x('a'); 
    std::cout << x << std::endl; 
} 
0

Pourquoi ne pas simplement vérifier chaque bit dans la variable unsigned char?

unsigned char b=0x80|0x20|0x01; //some test data 
int bitbreakout[8]; 
if(b&0x80) bitbreakout[7]=1; 
//repeat above for 0x40, 0x20, etc. 
cout << bitbreakout; 

Il ya beaucoup de façons d'optimiser cela, mais cela devrait vous donner une idée de ce qu'il faut faire.

0
#include <iostream> 
using namespace std; 
int main(){ 
    int x = 255; 

    for(int i = numeric_limits<int>::digits; i >=0; i--){ 
     cout << ((x & (1 << i)) >> i); 
    } 
}