23

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?

John Topley
  • 113,588
  • 46
  • 195
  • 237
grosauro
  • 401
  • 1
  • 4
  • 11
  • 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 Answers5

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
  • Besides strtol there's also stroll (two L) for "long long" integers. – jkramer Sep 22 '08 at 22:21
  • 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