Fecha y hora actual: Lunes 22 Jul 2019 16:37
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

Convertir de decimal a binario (lenguaje C)

Responder al Tema

Índice del Foro > C, C#, Visual C++ > Convertir de decimal a binario (lenguaje C)

Autor Mensaje
DanielC
Usuario Inquieto


Registrado: 27 Ene 2009
Mensajes: 133
Ubicación: Arequito - Santa Fé - Argentina

Mensaje Publicado: Martes 01 Jul 2014 15:39

Título del mensaje: Convertir de decimal a binario (lenguaje C)

Responder citando

Hola a todos.
Tengo un inconveniente con este código que no logro resolver por mí mismo y es que funciona bien cuando paso de decimal a binario cualquier entero no superior a 255 que es el número máximo que cabe en el tipo char sin signo.-
Tal vez la solución sea declarar un arreglo de char de 4 elementos pero no logro implementarlo.-

Código:
#include <stdio.h>

int main(void){
   unsigned char a=255, b=128;
   int i=0;

   for(; i<8; i++){   
      printf((a & b) ? "1" : "0");   
      b /=2;
   }
   
   printf("\n\n");
   return 0 ;
}


Como complemento.




Saludos.
Daniel


abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo
Pico
Usuario Activo


Registrado: 25 Jun 2013
Mensajes: 628

Mensaje Publicado: Miércoles 02 Jul 2014 07:51

Título del mensaje: Convertir de decimal a binario (lenguaje C)

Responder citando

Usa un unsigned short para 16 bits o unsigned int para 32.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
DanielC
Usuario Inquieto


Registrado: 27 Ene 2009
Mensajes: 133
Ubicación: Arequito - Santa Fé - Argentina

Mensaje Publicado: Miércoles 02 Jul 2014 15:12

Título del mensaje: Convertir de decimal a binario (lenguaje C)

Responder citando

Hola Pico.
Mil disculpas, lo que propones lo había hecho una veintena de veces y siempre con resultado incorrecto, ponía mal la máscara.-

Saludos.
Daniel


abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo
Pico
Usuario Activo


Registrado: 25 Jun 2013
Mensajes: 628

Mensaje Publicado: Miércoles 02 Jul 2014 15:30

Título del mensaje: Convertir de decimal a binario (lenguaje C)

Responder citando

Mira el gráfico que has puesto. Un & lo que hace es una comprobación bit a bit. El bit 0 de un operando con el bit 0 del otro; el bit 1 de un operando con el bit 1 del otro. Y así hasta el último. Para comprobar el estado de un determinado bit se le hace un & con un número que tenga sólo ese bit a 1. Si el resultado da distinto de 0 es que tiene ese bit a 1, si no, da de resultado 0.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
DanielC
Usuario Inquieto


Registrado: 27 Ene 2009
Mensajes: 133
Ubicación: Arequito - Santa Fé - Argentina

Mensaje Publicado: Jueves 03 Jul 2014 22:20

Título del mensaje: Convertir de decimal a binario (lenguaje C)

Responder citando

Hola a todos.
Pico si te muestro el error que cometía con la máscara, me harían una seña que no queda muy ético en público.-
Bueno al fin funciona de forma correcta, con un error que por más que investigo no puedo solucionar, es muy probable que sea algo mínimo pero como hice muchos cambios al fin me emboté.-
El problema es que si ingreso un número superior a 2147483647 lo transforma a 2147483647 y sin embargo con unsigned int se puede ingresar hasta 4294967295, como lo muestra la imagen.-
Espero que me puedan dar una mano con esto.-

Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <ctype.h>

void verifica(char numChar[], unsigned int *numInt);
void convertir(unsigned int numInt);

int main(void){
   char numChar[11] = {'\0'};
   unsigned int numInt=0;

   do{
      printf("\n\n ===== Convierte de decimal a binario =====");
      printf("\n\n Ingrese un entero (M%cximo soportado...:%u)...:", 160, UINT_MAX);
      fgets(numChar, 11, stdin);
      verifica(numChar, &numInt);
      if(numInt==0){
         printf("\n Error en el ingreso, verifique....");
         printf("\n\n\t Pulse una tecla para continuar..."); getchar();   
      }
      else{
         convertir(numInt);
      }   
   }while(numInt==0);

   printf("\n\n");
   return 0 ;
}

void verifica(char numChar[], unsigned int *numInt){
   char *p=NULL;
   unsigned int ch=0, i=0, ok=8;
   if((p=strchr(numChar, '\n'))){
      *p='\0';
   }
   else{
      numChar[11] = '\n';
      while((ch = getchar()) !='\n' && ch!=EOF);
   }

   for(; numChar[i]; i++){
      ok=isdigit(numChar[i]);
      if(ok==0){break;}      
   }
   if(ok>=1){
      *numInt = atoi(numChar);
   }
}

void convertir(unsigned int numInt){
   unsigned int i=0, mascara=2147483648;

   printf("\n El n%cmero %d convertido a binario --> ", 163, numInt);
   for(; i<32; i++){   
      if(i%8 == 0) printf(" ");   
      printf((numInt & mascara) ? "1" : "0");
      mascara /=2;
   }
}




Saludos.
Daniel


abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo
Pico
Usuario Activo


Registrado: 25 Jun 2013
Mensajes: 628

Mensaje Publicado: Jueves 03 Jul 2014 22:50

Título del mensaje: Convertir de decimal a binario (lenguaje C)

Responder citando

Veo dos errores y medio.

Si quieres poner un retorno del carro después de numChar tiene que valer 12, no 11, dado que 10 son las cifras de un int, más el 0 más el retorno del carro son 12. Este error da un pateo de pila, que no siempre indican los depuradores.

atoi transforma la entrada en un int, no en un uint, con lo que si le pasas algo mayor que un int va a prescindir del resto.

El medio error es que cuando tengas un unit de verdad la máscara tiene que ser de uint, no de int. Tiene que ser 4294967295. 0xFFFFFFFF en hexadecimal, que se ve más claro.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
DanielC
Usuario Inquieto


Registrado: 27 Ene 2009
Mensajes: 133
Ubicación: Arequito - Santa Fé - Argentina

Mensaje Publicado: Viernes 04 Jul 2014 20:19

Título del mensaje: Convertir de decimal a binario (lenguaje C)

Responder citando

Hola Pico.
Algunas aclaraciones con respecto a los errores:
En esta línea tenía el error
numChar[11] = '\n'; // debía ser numChar[11] = '\0';

La segunda debía reemplazar atoi por atol.-

La tercera tal vez no interpreto bien:
Cita:
decimal hexadecimal binario
4294967295 0xFFFFFFFF 11111111111111111111111111111111

Para saber el estado de un determinado bit la máscara debe contener encendido únicamente ese bit y el resto apagado y con tu mascara están todos encendidos.-
En mi caso me funciona de esta manera
Cita:
decimal hexadecimal binario
2147483648 0x 80000000 10000000000000000000000000000000

Parece ser que el problema lo tengo con atol y no encuentro la solución, con este programita me funciona a la perfección con el otro me lo convierte en un unsigned int y no en un unsigned long int.-

Código:
#include <stdio.h>
#include <stdlib.h>

int main(void){
   char numChar[11] = "4000000000";
   unsigned long int numInt = atol(numChar);

   printf( "\n%u\n", numInt );

   return 0;
}


Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <ctype.h>

void verifica(char numChar[], unsigned long int *numInt);
void convertir(unsigned long int numInt);

int main(void){
   char numChar[11] = {'\0'};
   unsigned long int numInt=0;

   do{
      printf("\n\n ===== Convierte de decimal a binario =====");
      printf("\n\n Ingrese un entero (M%cximo soportado...:%u)...:", 160, UINT_MAX);
      fgets(numChar, 11, stdin);
      verifica(numChar, &numInt);
      if(numInt==0){
         printf("\n Error en el ingreso, verifique....");
         printf("\n\n\t Pulse una tecla para continuar..."); getchar();   
     }
     else{
      convertir(numInt);
     }   
   }while(numInt==0);
   
   printf("\n\n");
   return 0 ;
}

void verifica(char numChar[], unsigned long int *numInt){
   char *p=NULL;
   int ch=0, i=0, ok=8;
   if((p=strchr(numChar, '\n'))){
      *p='\0';
   }
   else{
      numChar[11] = '\0';
      while((ch = getchar()) !='\n' && ch!=EOF);
   }

   for(; numChar[i]; i++){
      ok=isdigit(numChar[i]);
      if(ok==0){break;}     
   }
   if(ok>=1){
      *numInt = atol(numChar);
   }
}

void convertir(unsigned long int numInt){
   unsigned int mascara=0x80000000;
   int i=0;   
   
   printf("\n El n%cmero %ld convertido a binario --> ", 163, numInt);
   for(; i<32; i++){   
      if(i%8 == 0) printf(" ");   
      printf((numInt & mascara) ? "1" : "0");
      mascara /=2;
   }
}


Espero alguna idea salvadora.-
Saludos.
Daniel


abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo
Pico
Usuario Activo


Registrado: 25 Jun 2013
Mensajes: 628

Mensaje Publicado: Viernes 04 Jul 2014 21:38

Título del mensaje: Convertir de decimal a binario (lenguaje C)

Responder citando

Si numChar es char numChar[11] = {'\0'}; no puedes hacer numChar[11] = '\0';. numChar tiene 11 posiciones, que van del 0 al 10, y el 11 está fuera de numChar. Con eso estás pateando la pila. Hay que tener mucho cuidado con eso porque hay compiladores que no avisan de ese error, y puede provocar cualquier cosa. Tampoco hace falta que le pongas un \0 al final, pues ya lo pone la función de entrada de caracteres.

Sí, de máscara, para 32 bits, tienes que poner 2147483648. Me había hecho la idea de que ese valor era el mayor que admite un int, o sea, 31 bits, y lo que quería decirte es que la máscara tenía que ser de 32 bits. Por eso es mejor usar hex para esas cosas. Un 2147483648 se sabe mucho peor lo que es que un 0x80000000.

Para transformar un array de caracteres en un unsigned int usa strtoul.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
DanielC
Usuario Inquieto


Registrado: 27 Ene 2009
Mensajes: 133
Ubicación: Arequito - Santa Fé - Argentina

Mensaje Publicado: Sábado 05 Jul 2014 22:11

Título del mensaje: Convertir de decimal a binario (lenguaje C)

Responder citando

Hola Pico.
Cita:
Si numChar es char numChar[11] = {'\0'}; no puedes hacer numChar[11] = '\0';. numChar tiene 11 posiciones, que van del 0 al 10, y el 11 está fuera de numChar…..

Error infantil el mío, en el futuro tendré más cuidado.-
Con respecto a strtoul funciona a la perfección.-
Debería dar el tema por finalizado sólo que quiero ver si logro validar que la cadena
Antes de ser pasada a entero no sobrepase el máximo permitido para el tipo unsigned long int, si no lo logro les consulto.-
La idea que tengo hasta el momento.-


Saludos.
Daniel


abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo
Pico
Usuario Activo


Registrado: 25 Jun 2013
Mensajes: 628

Mensaje Publicado: Domingo 06 Jul 2014 13:42

Título del mensaje: Convertir de decimal a binario (lenguaje C)

Responder citando

Código:
bool comprobar(char numChar[])
{
    if (numChar[9] == 0) return true;
    if (numChar[0] > '4') return false;
    if (numChar[1] > '2') return false;
    if (numChar[3] > '4') return false;
    if (numChar[5] > '6') return false;
    if (numChar[6] > '7') return false;
    if (numChar[7] > '2') return false;
    if (numChar[9] > '5') return false;
    return true; 
}


A ver si te queda mejor.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
DanielC
Usuario Inquieto


Registrado: 27 Ene 2009
Mensajes: 133
Ubicación: Arequito - Santa Fé - Argentina

Mensaje Publicado: Domingo 06 Jul 2014 16:20

Título del mensaje: Convertir de decimal a binario (lenguaje C)

Responder citando

Hola.
Esta es mi versión, no la probé con todas las posibilidades, pero creo que la lógica es correcta, igual los elementos [2] [4] y [8] no debería verificarlos porque es imposible que de incorrecto pero es tan chico el bucle que me pareció innecesario.-
Lo de que sea un numero decimal entero y que tenga un total de 10 dígitos ya está validado en el programa.-

Código:
#include<stdio.h>

int main(void){
   char ingreso[] = {4,2,9,4,9,6,7,2,9,5}, unsLongInt[] = {4,2,9,4,9,6,7,2,9,5};
   int i=0, ok=1;

   for(; i<10; i++){
      if(ingreso[i] > unsLongInt[i]){
         ok=0;
         break;
      }
   }
   printf((ok) ? "\n Ingreso correcto" : "\n Error en ingreso");
   return 0;
}

//4294967295


Saludos.
Daniel


abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo
Responder al Tema
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 2 Horas

Temas relacionados

Tema Autor Foros Respuestas Publicado
El foro no contiene ningún mensaje nuevo

Traducir algoritmo a lenguaje pascal!

Carlos bayona Programación en general 2 Lunes 01 Jul 2019 20:21 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Debate: ¿Cual es el mejor lenguaje de programac...

Samuel Martinez Programación en general 2 Lunes 10 Jun 2019 09:06 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Necesito ayuda en este codigo en lenguaje c

EmmanuelTR9 C, C#, Visual C++ 0 Lunes 08 Oct 2018 18:38 Ver último mensaje
El foro no contiene ningún mensaje nuevo

CONSULTA SOBRE QUE LENGUAJE DE PROGRAMACION UTI...

Federico Jose Temas generales 3 Sábado 01 Sep 2018 13:23 Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,