2011-03-30 21 views
5

Estoy tratando de convertir un número entero 10 en el número binario de 1010.la conversión de un entero a binario en C

Este código lo intenta, pero me da un error de segmentación en el strcat():

int int_to_bin(int k) 
{ 
    char *bin; 

    bin = (char *)malloc(sizeof(char)); 
    while(k>0) { 
     strcat(bin, k%2); 
     k = k/2; 
     bin = (char *)realloc(bin, sizeof(char) * (sizeof(bin)+1)); 
    } 
    bin[sizeof(bin)-1] = '\0'; 

    return atoi(bin); 
} 

¿Cómo convierto un número entero en binario en C?

+0

No hay razón para cualquier asignación (mucho menos 'realloc') para esta operación. El tamaño de un tipo dado en bits es (muy pequeño) una constante, así que simplemente use un buffer que sea del tamaño correcto para empezar. –

Respuesta

12

Si desea transformar un número en otro número (no el número de cuerdas de caracteres), y se puede hacer con un pequeño rango (0 a 1023 para las implementaciones con enteros de 32 bits), no es necesario añadir a la solución char*

unsigned int_to_int(unsigned k) { 
    if (k == 0) return 0; 
    if (k == 1) return 1;      /* optional */ 
    return (k % 2) + 10 * int_to_int(k/2); 
} 

HalosGhost sugeridos para compactar el código en una sola línea

unsigned int int_to_int(unsigned int k) { 
    return (k == 0 || k == 1 ? k : ((k % 2) + 10 * int_to_int(k/2))); 
} 
+0

Oye, gracias, esto fue mucho más simple que lo que tenía. – JJRhythm

+0

¡Esto es mucho más simple que usar una cadena! ¿Se te ocurrió? ¡Gracias! – Hugo

+1

@Hugo: probablemente sí (fue hace más de 5 años). De todos modos, tenga en cuenta que para las implementaciones de 32 bits, el límite es '1023' (' int_to_int (1023) == 1111111111; ';' int_to_int (1024) == ; '). – pmg

6

Debe inicializar el contenedor, p.

bin = malloc(1); 
bin[0] = '\0'; 

o utilizar calloc:

bin = calloc(1, 1); 

También tiene un error aquí:

bin = (char *)realloc(bin, sizeof(char) * (sizeof(bin)+1)); 

esto tiene que ser:

bin = (char *)realloc(bin, sizeof(char) * (strlen(bin)+1)); 

(es decir, utilizar strlen, no sizeof).

y debes aumentar la talla antes de llamar a strcat.

Y no está liberando la basura, por lo que tiene una pérdida de memoria.

Y que necesita para convertir 0, 1 a '0', '1'.

Y no se puede strcat un char a una cadena.

Por lo tanto, aparte de eso, está cerca, pero el código probablemente debería ser de la misma familia (advertencia, no probado!):

int int_to_bin(int k) 
{ 
    char *bin; 
    int tmp; 

    bin = calloc(1, 1); 
    while (k > 0) 
    { 
     bin = realloc(bin, strlen(bin) + 2); 
     bin[strlen(bin) - 1] = (k % 2) + '0'; 
     bin[strlen(bin)] = '\0'; 
     k = k/2; 
    } 
    tmp = atoi(bin); 
    free(bin); 
    return tmp; 
} 
+1

Está liberando bin antes de usarlo en atoi. No es una buena idea. Tendrá que usar otra variable auxiliar (es decir, 'int tmp = atoi (bin); free (bin); return tmp;'). – Saytonurn

+0

Simplemente evite las asignaciones de memoria en el montón, por completo. Ver mi respuesta :) –

+0

Gracias por señalar los problemas que olvidé por completo de agregar el + '0' para int a char por lo que tampoco funcionó en el otro sentido, y el strlen() también. – JJRhythm

4

Simplemente use itoa para convertir a una cadena, luego use atoi para convertir de nuevo a decimal.

unsigned int_to_int(unsigned int k) { 
    char buffer[65]; /* any number higher than sizeof(unsigned int)*bits_per_byte(8) */ 
    return atoi(itoa(k, buffer, 2)); 
} 
+0

simple y no reinventar la rueda. – fjardon

+0

¿No debería ser 'return atoi (itoa (k, buffer, 2));' en su lugar? – peonicles

+0

@peonicles es correcto –

-4
short a; 
short b; 
short c; 
short d; 
short e; 
short f; 
short g; 
short h; 
int i; 
char j[256]; 

printf("BINARY CONVERTER\n\n\n"); 

//uses <stdlib.h> 

while(1) 
{ 

a=0; 
b=0; 
c=0; 
d=0; 
e=0; 
f=0; 
g=0; 
h=0; 
i=0; 


gets(j); 
i=atoi(j); 
if(i>255){ 
printf("int i must not pass the value 255.\n"); 
i=0; 
} 
if(i>=128){ 
a=1; 
i=i-128;} 
if(i>=64){ 
b=1; 
i=i-64;} 
if(i>=32){ 
c=1; 
i=i-32;} 
if(i>=16){ 
d=1; 
i=i-16;} 
if(i>=8){ 
e=1; 
i=i-8;} 
if(i>=4){ 
f=1; 
i=i-4;} 
if(i>=2){ 
g=1; 
i=i-2;} 
if(i>=1){ 
h=1; 
i=i-1;} 

printf("\n%d%d%d%d%d%d%d%d\n\n",a,b,c,d,e,f,g,h); 
} 
1

función Puede utilizar esta función para devolver char * con representación de cadena del número entero:

char* itob(int i) { 
     static char bits[8] = {'0','0','0','0','0','0','0','0'}; 
     int bits_index = 7; 
     while (i > 0) { 
     bits[bits_index--] = (i & j) + '0'; 
     i = (i >> 1); 
     } 
     return bits; 
    } 

Se s not perfect implementation but if you test with a simple printf("%s", itob(170)), you Conseguiré 01010101 por lo que recuerdo era 170. Agregue atoi (itob (170)) y usted ll get the integer but it s definitivamente no 170 en valor entero.

1

La solución de trabajo para el número entero a la conversión binaria está por debajo.

int main() 
{ 
    int num=241; //Assuming 16 bit integer 
    for(int i=15; i>=0; i--) cout<<((num >> i) & 1); 
    cout<<endl; 
    for(int i=0; i<16; i++) cout<<((num >> i) & 1); 
    cout<<endl; 
    return 0; 
} 

Usted puede capturar el cout < < parte en base a sus propias necesidades.

2

Bueno, yo tenía el mismo problema ... así que encontré este hilo

Creo que la respuesta del usuario: "PMG" no funciona siempre.

unsigned int int_to_int(unsigned int k) { 
    return (k == 0 || k == 1 ? k : ((k % 2) + 10 * int_to_int(k/2))); 
} 

Motivo: la representación binaria se almacena como un número entero. Eso es bastante limitado. Imagínese convertir un decimal a binario:

dec 255 -> hex 0xFF -> bin 0b1111_1111 
dec 1023 -> hex 0x3FF -> bin 0b11_1111_1111 

y hay que almacenar esta representación binaria como si fuera un número decimal.

Creo que la solución de Andy Finkenstadt es el más cercano a lo que necesita

unsigned int_to_int(unsigned int k) { 
    char buffer[65]; // any number higher than sizeof(unsigned int)*bits_per_byte(8) 
    return itoa(atoi(k, buffer, 2)); 
} 

pero aún así esto no funciona para un gran número. Sin sorpresas, ya que probablemente no necesite convertir la cadena de nuevo a decimal. Tiene menos sentido. Si necesita un número binario por lo general lo necesario para un texto algún lugar, por lo que lo deja en formato de cadena.

simplemente utilizar itoa()

char buffer[65]; 
itoa(k, buffer, 2); 
+0

Agradezco su respuesta.Pero la cuestión es que estás respondiendo a una pregunta que tiene más de 3 años. – niyasc

+0

Sé que tiene 3 años, pero ahora tenía el mismo problema. Y descubrió una información engañosa en las respuestas anteriores ... – drkovacs

+0

¿Qué es engañoso en "si ... se puede hacer con un rango pequeño"? – pmg

0

Se puede usar esta función para obtener matriz de bits desde un entero.

int* num_to_bit(int a, int *len){ 
     int arrayLen=0,i=1; 
     while (i<a){ 
      arrayLen++; 
      i*=2; 
     } 
     *len=arrayLen; 
     int *bits; 
     bits=(int*)malloc(arrayLen*sizeof(int)); 
     arrayLen--; 
     while(a>0){ 
      bits[arrayLen--]=a&1; 
      a>>=1; 
     } 
     return bits; 
    } 
0
void intToBin(int digit) { 
    int b; 
    int k = 0; 
    char *bits; 

    bits= (char *) malloc(sizeof(char)); 
    printf("intToBin\n"); 
    while (digit) { 
     b = digit % 2; 
     digit = digit/2; 
     bits[k] = b; 
     k++; 

     printf("%d", b); 
    } 
    printf("\n"); 
    for (int i = k - 1; i >= 0; i--) { 
     printf("%d", bits[i]); 

    } 

} 
+0

Agregue algunas explicaciones para aclarar cómo esto resuelve el problema. – ekhumoro