将由1和0组成的字符串转换为二进制值

23

我正在尝试将来自stdin的1和0的字符串转换为它们相应的二进制值(例如,将类似于“11110111”的字符串转换为0xF7)。这似乎很简单,但我不想重复造轮子,所以我想知道C/C++标准库中是否已经有可以执行此操作的函数?


不是作业。我正在尝试将一个转换器嵌入到一组调试工具中,以便更轻松地阅读,但我们所有的输入都以字符串格式传递。 - grosauro
5个回答

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

对于更大的数字,有一个long long版本,strtoll


这看起来差不多正确。我唯一的担忧是在非常大的字符串上,现在考虑起来,可能需要一些自定义代码。 - grosauro
除了strtol之外,还有一个名为stroll(两个L)的函数可以用于“long long”整数。 - jkramer
啊,现在我明白你的意思了。只要结果数字适合于长整型或长长整型整数,字符串长度就不应该成为问题。 - jkramer
只有当您的二进制字符串长于64个1和0时,才是一个问题。那时,在long long范围之外,您将会出现错误。 - Charles

14

如果您在编译时已知位数,则可以使用 std::bitset。
尽管有些程序可以将其分成块并进行组合。

#include <bitset>
#include <iostream>

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

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

10
你可以使用strtol。
char string[] = "1101110100110100100000";
char * end;
long int value = strtol (string,&end,2);

6
您可以使用 Boost Dynamic Bitset:
boost::dynamic_bitset<>  x(std::string("01011"));
std::cout << x << ":" << x.to_ulong() << std::endl;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接