2008-09-22 4 views
18

Ich versuche einen eingehenden Sting von 1s und 0s von stdin in ihre jeweiligen binären Werte zu konvertieren (wo eine Zeichenkette wie "11110111" in 0xF7 konvertiert würde). Dies scheint ziemlich trivial zu sein, aber ich möchte das Rad nicht neu erfinden, also frage ich mich, ob es irgendetwas in den C/C++ - Standardbibliotheken gibt, die eine solche Operation bereits ausführen können?Umwandlung von 1s und 0s in einen binären Wert

+0

Keine Hausaufgaben. Ich versuche, einen Konverter einzubetten, um einfacher in eine Reihe von Debugging-Tools zu lesen, aber alle unsere Eingaben kommen im String-Format durch. – grosauro

Antwort

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; 
} 

verwenden, gibt als long long Version, strtoll.

+0

Das sieht ungefähr richtig aus. Meine einzige Sorge war auf sehr große Saiten, die, wenn ich jetzt darüber nachdenke, wahrscheinlich sowieso irgendeinen benutzerdefinierten Code benötigen würden. – grosauro

+0

Neben Strtol gibt es auch einen Spaziergang (zwei L) für "Long Long" ganze Zahlen. – jkramer

+0

Ah, jetzt sehe ich deinen Standpunkt. Die Länge der Zeichenfolge sollte kein Problem sein, solange die resultierende Zahl in die lange oder lange lange Ganzzahl passt. – jkramer

9

können Sie strtol Für größere Zahlen

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

Sie können std :: bitset verwenden (wenn dann die Länge Ihrer Bits zur Kompilierzeit bekannt ist)
Obwohl mit einem Programm könnten Sie es in Stücke aufteilen und kombinieren.

#include <bitset> 
#include <iostream> 

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

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

können Sie dynamische Bitset boost:

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

Ich habe ein paar Funktionen für diese und lizenziert unter der LGPL schrieb. Kann here gefunden werden.

+0

Ich schaute auf Ihren Quellcode, wirklich nette Arbeit! Ich kopierte auch die Bit-Operation-Funktionen + schrieb auf Papier für die Logik: D Ich werde diese verwenden. – TuukkaX