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?
Antworten
Zu viele Anzeigen?
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;
}
Torlack
Punkte
4287
Rob
Punkte
72944
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;
}