2008-09-22 8 views
18

Estoy tratando de convertir un sting entrante de 1s y 0s de stdin en sus respectivos valores binarios (donde una cadena como "11110111" se convertiría a 0xF7). Esto parece bastante trivial, pero no quiero reinventar la rueda, así que me pregunto si hay algo en las librerías estándar de C/C++ que ya pueda realizar esa operación.Convertir cadena de 1s y 0s en el valor binario

+0

No deberes. Estoy tratando de incorporar un convertidor para facilitar la lectura en un conjunto de herramientas de depuración, pero todas nuestras entradas vienen en formato de cadena. – grosauro

Respuesta

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

int main(void) { 
    char * ptr; 
    long parsed = strtol("11110111", & ptr, 2); 
    printf("%lX\n", parsed); 
    return EXIT_SUCCESS; 
} 

Para los números más grandes, como una versión long long, strtoll.

+0

Esto se ve bien. Mi única preocupación era en cadenas muy grandes, que pensando en ello ahora, probablemente necesitaría algún código personalizado de todos modos. – grosauro

+0

Además de strtol también hay un paseo (dos L) para enteros "largos". – jkramer

+0

Ah, ahora veo tu punto. La longitud de la cuerda no debería ser un problema, siempre y cuando el número resultante encaje en el entero largo o largo. – jkramer

9

Puede utilizar strtol

char string[] = "1101110100110100100000"; 
char * end; 
long int value = strtol (string,&end,2); 
14

Puede usar std :: bitset (si la longitud de los bits se conoce en tiempo de compilación)
Aunque con algún programa puede dividirlo en fragmentos y combinar.

#include <bitset> 
#include <iostream> 

int main() 
{ 
    std::bitset<5> x(std::string("01011")); 

    std::cout << x << ":" << x.to_ulong() << std::endl; 
} 
6

Puede utilizar refuerzo dinámico Bitset:

boost::dynamic_bitset<> x(std::string("01011")); 
std::cout << x << ":" << x.to_ulong() << std::endl; 
1

Yo he escrito un par de funciones para esto y licenciado bajo LGPL. Se puede encontrar here.

+0

¡Miré su código fuente, realmente buen trabajo! También copié las funciones de operación de bits + escribí en papel para la lógica de cálculo: D las usaré. – TuukkaX

Cuestiones relacionadas