2010-02-26 25 views
7

¿Cómo convierto una cadena binaria como "010011101" en una int, y cómo convierto un int, como 5, en una cadena "101" en C?Convertir cadena de formato binario a int, en C

+0

primera mitad de la cuestión está en http://stackoverflow.com/ questions/117844/converting-string-of-1s-and-0s-into-binary-value – Jimmy

Respuesta

10

Si se trata de un problema de tarea es probable que quieran a implementar strtol, que tendría un bucle o menos así:

char* start = &binaryCharArray[0]; 
int total = 0; 
while (*start) 
{ 
total *= 2; 
if (*start++ == '1') total += 1; 
} 

Si desea conseguir la suposición que podría utilizar estos en el bucle: "? en C "

total <<= 1; 
    if (*start++ == '1') total^=1; 
+0

encontró una solución aún más sofisticada..' while (len--) {ret = (ret << 1) | (* bits ++ & 1);} ' –

19

La función strtol en la biblioteca estándar tiene un parámetro de "base", que en este caso sería 2.

int fromBinary(const char *s) { 
    return (int) strtol(s, NULL, 2); 
} 

(primer código C que he escrito en unos 8 años :-)

+2

@Pointy: código agradable después de 8 años: P :) – t0mm13b

+1

En C, no hay un literal "nulo" incorporado. Hay una macro, NULL, por lo que debe estar en mayúscula. Además, el argumento de cadena debe hacerse "const", ya que la función no lo modificará. – unwind

+0

oh correcto. Yo, probablemente hubiera usado "0" después de que el compilador me dijera acerca del error :-) – Pointy

0

Supongo que realmente depende de algunas preguntas sobre sus cadenas/programa. Si, por ejemplo, sabía que su número no sería superior a 255 (IE solo usaba 8 bits u 8 0s/1s), podría crear una función en la que le entregue 8 bits de su cadena, la recorra y agregue a una suma que devolviste cada vez que tocas un 1. IE si tocas el bit para 2^7 agrega 128 y el siguiente bit que tocaste fue 2^4 suma 16.

Esta es mi idea rápida y sucia. Pienso más y Google para ti mientras estás en la escuela. : D

0

para la segunda parte de la pregunta, es decir,"¿cómo puedo convertir un int, al igual que 5, a una cadena" 101, intentar algo como:

void 
ltostr(unsigned long x, char * s, size_t n) 
{ 
    assert(s); 
    assert(n > 0); 

    memset(s, 0, n); 
    int pos = n - 2; 

    while(x && (pos >= 0)) 
    { 
    s[ pos-- ] = (x & 0x1) ? '1' : '0'; // Check LSb of x 
    x >>= 1; 
    } 
} 
0

Usted puede usar la siguiente codificación

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int main (void) 
{ 
    int nRC = 0; 
    int nCurVal = 1; 
    int sum = 0; 
    char inputArray[9]; 
    memset(inputArray,0,9); 
    scanf("%s", inputArray); 
    // now walk the array: 
    int nPos = strlen(inputArray)-1; 
    while(nPos >= 0) 
    { 
     if(inputArray[nPos] == '1') 
     { 
     sum += nCurVal; 
     } 
     --nPos; 
     nCurVal *= 2; 
    } 
    printf("%s converted to decimal is %d\n", inputArray, sum); 
    return nRC; 
} 
0

uso como esto:

char c[20]; 
int s=23; 

itoa(s,c,2); 
puts(c); 

Salida:

10111 
+0

Nota:' itoa' es una función C no estándar –