Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将1和0的字符串转换为二进制值_C++_C_Binary - Fatal编程技术网

C++ 将1和0的字符串转换为二进制值

C++ 将1和0的字符串转换为二进制值,c++,c,binary,C++,C,Binary,我正在尝试将stdin中传入的1和0的sting转换为各自的二进制值(其中,诸如“11110111”之类的字符串将转换为0xF7)。这看起来很简单,但我不想重新发明轮子,所以我想知道C/C++标准库中是否有任何东西可以执行这样的操作?您可以使用strtol char string[] = "1101110100110100100000"; char * end; long int value = strtol (string,&end,2); #包括 #包括 内部主(空){ char*

我正在尝试将stdin中传入的1和0的sting转换为各自的二进制值(其中,诸如“11110111”之类的字符串将转换为0xF7)。这看起来很简单,但我不想重新发明轮子,所以我想知道C/C++标准库中是否有任何东西可以执行这样的操作?

您可以使用strtol

char string[] = "1101110100110100100000";
char * end;
long int value = strtol (string,&end,2);
#包括
#包括
内部主(空){
char*ptr;
长解析=strtol(“11110111”和ptr,2);
printf(“%lX\n”,已解析);
返回退出成功;
}
对于较大的数字,有一个
long-long
版本,
strtoll

您可以使用std::bitset(如果在编译时知道位的长度)
虽然有了一些程序,你可以把它分解成块并组合起来

#include <bitset>
#include <iostream>

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

    std::cout << x << ":" << x.to_ulong() << std::endl;
}
#包括
#包括
int main()
{
std::位集x(std::字符串(“01011”);

std::cout您可以使用Boost动态位集:

boost::dynamic_bitset<>  x(std::string("01011"));
std::cout << x << ":" << x.to_ulong() << std::endl;
boost::dynamic_位集x(std::string(“01011”);

std::cout我已经为此编写了一些函数,并在LGPL下获得了许可。可以找到。

\include
#包括
#包括
使用名称空间std;
字符串getBinaryString(int值,无符号int长度,布尔反向){
字符串输出=字符串(长度为“0”);
如果(!反向){
for(无符号整数i=0;iif((value&)(1)这看起来是对的。我唯一关心的是非常大的字符串,现在考虑一下,可能无论如何都需要一些自定义代码。除了strtol,还有walk(两个L)表示“long long”整数。啊,现在我明白你的意思了。只要得到的数字适合长整数或长整数,字符串长度就不会有问题。只有当你的二进制字符串超过64
1
s和
0
s时才有问题。然后,你就超出了
long
的范围。这不是家庭作业。我正在尝试嵌入一个转换器r更容易读懂一套调试工具,但我们所有的输入都是字符串格式的。我看了你的源代码,做得很好!我还复制了位运算函数+写在纸上进行逻辑计算:D我将使用它们。
boost::dynamic_bitset<>  x(std::string("01011"));
std::cout << x << ":" << x.to_ulong() << std::endl;
#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;
}