2010-09-25 9 views
1

J'écris un programme qui convertit une chaîne binaire en décimal. Je voulais valider ma sortie avant de commencer vraiment cette méthode. J'ai le code suivant:C++ étrange sortie convertissant la chaîne en int

int get_val() 
    { 
     int sum =0; 
     for(int num_bits = size; num_bits>0; num_bits--) 
     { 
      printf("String sub %i is %i\n", num_bits, int(bin[num_bits])); 
     } 
    } 

Quand je entrée une chaîne de 16 zéros, je reçois la sortie suivante:

String sub 16 is 24 
String sub 15 is 0 
String sub 14 is 0 
String sub 13 is 0 
String sub 12 is 23 
String sub 11 is 0 
String sub 10 is 0 
String sub 9 is 0 
String sub 8 is 22 
String sub 7 is 0 
String sub 6 is 0 
String sub 5 is 0 
String sub 4 is 21 
String sub 3 is 0 
String sub 2 is 0 
String sub 1 is 0 

Pourquoi devrais-je parier obtenir des valeurs différentes si je saisis tous les zéros?

EDIT: bin est "0000000000000000"

+2

Vous semblez manquer un peu de code. –

+1

Quel est le tableau 'bin'? –

+2

Pourriez-vous s'il vous plaît poster le reste du code, en particulier ce que bin [] est? – schnaader

Répondre

1

Tant que la question ne soit pas mis à jour, peut-être ce code exemple aide. Il convertit une chaîne binaire en un entier. J'ai essayé de garder le plus possible de votre code et de vos noms de variables.

#include <stdio.h> 
#include <stdlib.h> 
#include <string> 

using namespace std; 

int main() { 
    string bin = "000111010"; 
    int size = bin.length(); 
    int sum = 0; 
    for(int num_bits = 1; num_bits <= size; num_bits++) { 
     sum <<= 1; 
     sum += bin[num_bits - 1] - '0'; 
    } 
    printf("Binary string %s converted to integer is: %i\n", bin.c_str(), sum); 
} 

Comme nous l'avons dit dans les commentaires, la principale astuce ici est de convertir les caractères ASCII « 0 » et « 1 » aux entiers 0 et 1 qui se fait en soustrayant la valeur de « 0 ». De plus, j'ai changé l'ordre de passage de la chaîne car de cette façon, vous pouvez décaler l'entier après chaque bit et toujours définir la valeur du bit le plus bas actuellement.

0

Réponse courte, vous ne le feriez pas.

Longue réponse, il y a quelques problèmes avec cela. Le premier gros problème est que si nous supposons que bin est un tableau standard de caractères de taille "taille", alors votre première impression est invalide. L'indice de tableau est désactivée par 1. Prenons l'exemple de code:

int size = 16; 
char * bin = new char[size]; 

for(int i=0; i<size; i++) 
{ 
    bin[i] = 0; 
} 

for(int num_bits = size; num_bits>0; num_bits--) 
{ 
    printf("String sub %i is %i\n", num_bits, int(bin[num_bits])); 
} 

qui produit:

String sub 16 is -3 
String sub 15 is 0 
String sub 14 is 0 
String sub 13 is 0 
String sub 12 is 0 
String sub 11 is 0 
String sub 10 is 0 
String sub 9 is 0 
String sub 8 is 0 
String sub 7 is 0 
String sub 6 is 0 
String sub 5 is 0 
String sub 4 is 0 
String sub 3 is 0 
String sub 2 is 0 
String sub 1 is 0 

A en juger par la sortie réelle que vous avez, je suppose que tu as fait quelque chose comme:

int size=16; 
int * ints = new int[size]; 
char * bin; 

//Fill with numbers, not zeros, based on the evidence 
for(int i=0; i<size; i++) 
{ 
    ints[i] = 20 + i; 
} 

//Copy over to character buffer 
bin = (char*)(void*)&(ints[0]); 

for(int num_bits = size; num_bits>0; num_bits--) 
{ 
    printf("String sub %i is %i\n", num_bits, int(bin[num_bits])); 
} 

Cela explique la sortie que vous avez vu parfaitement. Donc, je pense que votre hypothèse d'entrée, que bin pointe vers un tableau de zéros de caractères, n'est pas vraie. Il y a quelques gros problèmes avec cela, en supposant que vous ayez fait quelque chose comme ça.

  1. Votre hypothèse que la mémoire est tout à zéro est faux, et vous devez expliquer ou afficher le code réel et nous
  2. Vous ne pouvez pas traiter seulement une mémoire tampon des entiers comme des caractères - une chaîne est constitué d'un caractère d'octet (typiquement), les entiers sont de 4 octets, typiquement
  3. Arrays en C++ commencent à 0, pas 1
  4. jetant un caractère à un nombre entier [int (« 0 »)] ne convertit pas intelligemment - l'entier qui en sort est un nombre décimal 48, pas un nombre décimal 0 (il y a une fonction atoi qui fera cela, ainsi que d'autres meilleurs, ou l'autre suggestion d'utiliser le soustrac tion)