2010-01-10 36 views
1

J'ai une méthode pour convertir rabattant pour bincomment convertir décimal en binaire en C++

QList<bool> widgetInput::decToBin(int number) 
{ 
     int remainder; 
     QList<bool> result; 
     if(number <= 1) { 
      result << number; 
      return result; 
     } 

     remainder = number%2; 
     decToBin(number >> 1); 
     result << remainder; 


} 

mais malheureusement cette méthode ne contient qu'un seul élément dans la liste. mais quand je remplace le "résultat < < nombre" avec "cout < < nombre" cela va fonctionner. pourriez-vous m'aider s'il vous plaît et laissez-moi savoir où est mon problème exact?

salutations.

+1

pourquoi vous essayez de le faire récursive? – jrharshath

+0

'do {result << nombre & 1} while (nombre >> = 1); return result; '(Vous vouliez savoir où était le problème, donc ce n'est pas vraiment une réponse, c'est pourquoi c'est un commentaire) – falstro

+0

Le paramètre' number' est déjà représenté dans le programme en binaire, et le code ne l'est pas semblent faire toute référence à la décimale. J'ai donc été curieux de savoir pourquoi le nom de votre fonction implique la décimale, et pourquoi vous ne fournissez pas ce dont vous avez besoin en encapsulant le nombre dans une classe qui accède aux bits dont vous avez besoin. Peut-être que j'ai raté quelque chose. – Permaquid

Répondre

2

À chaque étape récursive, vous créez un nouveau résultat QList; qui est locale à cette étape, puis en y insérant le reste. Vous n'avez pas besoin récursion (et en général, il est recommandé d'éviter lorsque l'itération fera):

QList<bool> result; 

while(number > 0) { 
    result << number%2; 
    number /=2; 
} 

// Edited to add: Just realized you would also have to reverse QList here. 
// Depends on it's interface. 

return result; 

ou mieux encore, il suffit d'utiliser un conteneur standard:

bitset<sizeof(int)*CHAR_BIT> bs(number); 
2

Vous êtes très proche, mais vous aurez besoin de faire une modification:

remainder = number%2; 
    result << remainder << decToBin(number >> 1); 
    return result; 

Je ne sais pas exactement comment fonctionne QList, mais ce qui précède est destiné à ajouter le résultat de decToBin() après la remainder dans le résultat. Vous devrez peut-être modifier cela légèrement pour le faire fonctionner.

Le résultat contiendra alors la représentation binaire du numéro, en ordre « inverse » (avec le bit le moins significatif dans la première position de la liste).

0

QList<bool> result; est une variable locale donc il peut y avoir que des valeurs insérées dans cet appel de méthode. Et c'est seulement un.

Il y a peu de solutions:

  • Ajouter QList comme un paramètre de méthode et après que si fonctionnera bien
  • Ou append valeur retournée des appels récursifs à votre liste

Mais ces solutions avoir l'ordre inverse afin que vous puissiez choisir ce qui est mieux pour vous.

Et en passant, il vous manque la valeur de retour à la fin de la méthode. Le compilateur devrait donc annoncer un avertissement.

1

Tout d'abord pourquoi faire récursif?

Comme indiqué par d'autres, la variable result est locale, de sorte qu'elle se réinitialise à chaque fois que la méthode est appelée.

Parce que les ordinateurs sont des bêtes binaires, je changerais quelque chose comme ceci:

QList<bool> widgetInput::decToBin(int number) 
{ 
    QList<bool> result = new QList<bool>(); 
    while (number) 
    { 
     result.Add(number & 1); 
     number = number >> 1; 
    } 
    return result; 
} 
+2

QList résultat; ça ira. Pas besoin de la verbosité C# :) –

0

Il y a une solution itérative plus générique (qui n'a pas besoin de Qt):

NB1: Vous pouvez ignorez la partie "byte completion" ainsi que le "#include". Il vise juste à compléter la chaîne avec des zéros pour toujours obtenir un mutiple de 8 bits ...NB2: Utils est le nom de la classe où ces fonctions sont implémentées ... On m'a dit qu'une fonction inverse existe déjà dans la bibliothèque standard ... n'ont pas encore essayé.

NB3: Si vous n'êtes pas inverser la chaîne, le petit endian viendra d'abord ... donc le cas normal est littleEndianFirst = false

#include <string> 
#include <math.h> 

    static std::string decToBin(int number, bool littleEndianFirst) 
    { 
     std::string result = ""; 
     do 
     { 
      ((number & 1) == 0) ? result += "0" : result += "1"; 
      number >>= 1; 
     } while(number); 

     if(!littleEndianFirst) 
     { 
      result = Utils::reverse(result); 
     } 

     // byte completion 
     unsigned int completeByteLength = (ceil(result.length()/8.0))*8; 
     while(result.length() < completeByteLength) 
     { 
      littleEndianFirst ? result += "0" : result = "0" + result; 
     } 

     return result; 
    } 

    static std::string reverse(std::string to_reverse){ 
     std::string result; 
     for (int i = to_reverse.length()-1; i >=0 ; i--) 
      result += to_reverse[i]; 
     return result; 
    } 
Questions connexes