Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Zeit en 19 Marzo 2016, 16:38 pm



Título: Decimal a binario
Publicado por: Zeit en 19 Marzo 2016, 16:38 pm
Buenos días, tardes y noches tengan todos, tengo un pequeño problemilla, pasa que estoy aprendiendo c++ y por practica estoy desarrollando un conversor de decimal a binario, todo bien, el conversor funciona a la hora de pasar un numero de binario a decimal, solo que no lo reordena.
Por ejemplo, le doy 4 como valor principal y me devuelve 001, lo cual esta "bien" por que el valor binario de 4 es 100, lo que tengo es que reordenar los valores, para ordenarlo intento hacer un array pero tienen comportamientos demasiado caoticos, por ejemplo, me imprime direcciones de memoria, me imprime numeros que para mi son aleatorios y así, este es el codigo que tengo:

Código:
#include <iostream>
using namespace std;
int main(){
int n = 4;
int count=0;
int n_bin[8];
while(n != 0){
int m = n%2;
n = n/2;
count++;
n_bin[count]=m;
for(int i=8;i!=0;i--){
cout << n_bin[i];
}
}
}

P.S: Lo he intentado de otros modos y me sale el binario pero con un monton de 0's y 1's y no le veo el sentido, este es el otro codigo que he intentado usar:

Código:
#include <iostream>
using namespace std;
int main(){
int n = 4;
int byte = 8;
int n_bin[byte];
while(n != 0){
int m = n%2;
n = n/2;
for(int i=0;i<8;i++){
byte--;
n_bin[byte] = m;
cout << n_bin[byte];
}
}
}

Y mi ultima aberración (esta es la que imprime la direccion de la memoria):

Código:
#include <iostream>
using namespace std;
int main(){
int n = 4;
int byte = 8;
int n_bin[byte];
while(n != 0){
int m = n%2;
n = n/2;
n_bin[byte] = m;
cout << n_bin;
}
}

En:

Código:
cout << n_bin
le añadi un * del modo:

Código:
cout << *n_bin
y me sigue dando un monton de numeros aleatorios.

Si alguien pudiera hecharme una mano le agradecería mucho. ^^


Título: Re: Decimal a binario
Publicado por: class_OpenGL en 19 Marzo 2016, 17:28 pm
Primero, en el ciclo for donde muestras el contenido del arreglo estás accediendo a memoria fuera del arreglo. Un arreglo tiene los índices 0, 1, 2, ... hasta el tamaño que le hayas asignado - 1. Entonces, en el for estás accediendo al elemento '8' del arreglo, mientras que al elemento máximo que puedes acceder es al 7 (8 - 1).

Segundo, estás incrementando el count antes de tiempo. Esto lo digo porque nunca inicializas m_bin[0] (ya dijimos que accedemos al arreglo desde el elemento 0), pero sin embargo estás accediendo a m_bin[1], m_bin[2], ... Nunca llegas a cambiar el valor de m_bin[0].

Tercero, el for lo tienes que mostrar fuera del bucle while, porque si muestras el contenido del arreglo sin inicializar, lo que muestras es basura. Esa "basura" es memoria que antes había sido ocupada por otros programas/procesos. Por ejemplo, fijémonos en tu código:
Código
  1. while(n != 0){
  2.  int m = n%2;
  3.  n = n/2;
  4.  n_bin[count]=m;
  5.  for(int i=7;i!=0;i--){ // Corrige el i=8 por i=7
  6.   cout << n_bin[i];
  7.  }
  8.  count++; // Mejor aquí
  9. }

Si te fijas bien, ¿le has dado un valor a n_bin[7] inicialmente? No, porque inicialmente solo inicializas n_bin[0], pero no inicializas n_bin[1], etc... Entonces, tendrías que sacar el for fuera. Así, primero convertirías el valor a binario y luego mostrarías los resultados.

Código
  1. while(n != 0){
  2.    int m = n%2;
  3.    n = n/2;
  4.    n_bin[count]=m;
  5.    count++; // Mejor aquí
  6. }
  7.  
  8. for(int i=7;i!=0;i--){ // Corrige el i=8 por i=7
  9.    cout << n_bin[i];
  10. }


Título: Re: Decimal a binario
Publicado por: Zeit en 19 Marzo 2016, 18:17 pm
Gracias, he intentado tu solucion y luego de retocar el codigo un par de miles de veces  :xD ya me sale el codigo pseudo-ordenado, solo tuve algunos errores, por ejemplo al crear un arreglo de 7 digitos me saltaba violacion del segmento, pero lo solucione volviendo a colocar 8, cambie el ciclo while por un for, simplifique un poco el codigo y hize un contador decreciente pero ahora en vez de dar 00000100 me da 100000010, el codigo es...
Código
  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4. int n = 4;
  5. int count;
  6. int bits=8;
  7. int n_bin[bits];
  8. for(count=0;count!=bits;count++){
  9. n_bin[count] = n%2;
  10. n = n/2;
  11. }
  12. for(int i=bits;i!=0;i--){
  13. cout << n_bin[i];
  14. }
  15. }
  16.  


Título: Re: Decimal a binario
Publicado por: Zeit en 19 Marzo 2016, 23:20 pm
Ya esta solucionado, al final el error estaba en un operador, el codigo funcional:
Código
  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4.        int n = 2;
  5.        int count;
  6.        int n_bin[8];
  7.        for(count=0;count<8;count++){
  8.                int m = n%2;
  9.                n = n/2;
  10.                n_bin[count] = m;
  11.        }
  12.        for(int i=7; i >= 0; i--){
  13.                cout << n_bin[i];
  14.        }
  15. }
¡Muchas gracias! :D