I'm trying to convert an incoming sting of 1s and 0s from stdin into their respective binary values (where a string such as "11110111" would be converted to 0xF7). This seems pretty trivial but I don't want to reinvent the wheel so I'm wondering if there's anything in the C/C++ standard libs that can already perform such an operation?
Asked
Active
Viewed 2.2k times
23
-
Not homework. I'm trying to embed a converter for easier read into a set of debugging tools but all our input is coming through in string format. – grosauro Sep 22 '08 at 22:13
5 Answers
37
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char * ptr;
long parsed = strtol("11110111", & ptr, 2);
printf("%lX\n", parsed);
return EXIT_SUCCESS;
}
For larger numbers, there as a long long
version, strtoll
.

Klas Lindbäck
- 33,105
- 5
- 57
- 82

jkramer
- 15,440
- 5
- 47
- 48
-
This looks about right. My only concern was on very large strings, which thinking about it now, would probably need some custom code anyhow. – grosauro Sep 22 '08 at 22:10
-
-
Ah, now I see your point. The string length shouldn't be a problem as long as the resulting number fits into the long or long long integer. – jkramer Sep 22 '08 at 22:22
-
It is only a problem if your binary string is longer than 64 `1`s and `0`s. Then, you'd be out of range on `long long`. – Charles Dec 24 '15 at 22:29
14
You can use std::bitset (if then length of your bits is known at compile time)
Though with some program you could break it up into chunks and combine.
#include <bitset>
#include <iostream>
int main()
{
std::bitset<5> x(std::string("01011"));
std::cout << x << ":" << x.to_ulong() << std::endl;
}

Martin York
- 257,169
- 86
- 333
- 562
10
You can use strtol
char string[] = "1101110100110100100000";
char * end;
long int value = strtol (string,&end,2);

Torlack
- 4,395
- 1
- 23
- 24
6
You can use Boost Dynamic Bitset:
boost::dynamic_bitset<> x(std::string("01011"));
std::cout << x << ":" << x.to_ulong() << std::endl;

Rob
- 76,700
- 56
- 158
- 197
0
#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;
}

PentiumPro200
- 641
- 7
- 23