23 Stimmen

Umwandlung einer Kette von 1en und 0en in einen Binärwert

Ich versuche, eine eingehende Zeichenfolge von 1s und 0s von stdin in ihre jeweiligen Binärwerte zu konvertieren (wo eine Zeichenfolge wie "11110111" in 0xF7 konvertiert werden würde). Dies scheint ziemlich trivial, aber ich will nicht das Rad neu erfinden, so dass ich mich frage, ob es etwas in der C/C++-Standard-Bibliotheken, die bereits eine solche Operation durchführen können?

37voto

jkramer Punkte 15030
#include <stdio.h>
#include <stdlib.h>

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

Für größere Zahlen gibt es als long long Version, strtoll .

14voto

Martin York Punkte 245363

Sie können std::bitset verwenden (wenn die Länge der Bits zum Zeitpunkt der Kompilierung bekannt ist)
Mit einem Programm kann man sie jedoch in Stücke zerlegen und kombinieren.

#include <bitset>
#include <iostream>

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

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

10voto

Torlack Punkte 4287

Sie können strtol verwenden

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

6voto

Rob Punkte 72944

Sie können Boost Dynamic Bitset verwenden:

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

0voto

PentiumPro200 Punkte 619
#include <iostream>
#include <stdio.h>
#include <string>

using namespace std;

string getBinaryString(int value, unsigned int length, bool reverse) {
    string output = string(length, '0');
    if (!reverse) {
        for (unsigned int i = 0; i < length; i++) {
            if ((value & (1 << i)) != 0) {
                output[i] = '1';
            }
        }
    }
    else {
        for (unsigned int i = 0; i < length; i++) {
            if ((value & (1 << (length - i - 1))) != 0) {
                output[i] = '1';
            }
        }
    }
    return output;
}

unsigned long getInteger(const string& input, size_t lsbindex, size_t msbindex) {
    unsigned long val = 0;
    unsigned int offset = 0;
    if (lsbindex > msbindex) {
        size_t length = lsbindex - msbindex;
        for (size_t i = msbindex; i <= lsbindex; i++, offset++) {
            if (input[i] == '1') {
                val |= (1 << (length - offset));
            }
        }
    }
    else { //lsbindex < msbindex
        for (size_t i = lsbindex; i <= msbindex; i++, offset++) {
            if (input[i] == '1') {
                val |= (1 << offset);
            }
        }
    }
    return val;
}

int main() {
    int value = 23;
    cout << value << ": " << getBinaryString(value, 5, false) << endl;
    string str = "01011";
    cout << str << ": " << getInteger(str, 1, 3) << endl;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X