C++ 为什么bitset函数不能为二进制字符串(如1110或1011)返回正确的十进制值?

C++ 为什么bitset函数不能为二进制字符串(如1110或1011)返回正确的十进制值?,c++,string,binary,bitset,C++,String,Binary,Bitset,这是我的代码,它采用1和0的4个字符串,并使用位集函数将其转换为十进制。它为所有组合返回正确的值,但涉及11和10的组合除外,如{111010101011111}。对于这些数字,它将返回忽略MSB的结果。也就是说,1010它给出了2作为答案 #include<bits/stdc++.h> using namespace std; #define ul unsigned long int main(int argc, char const *argv[]) { int bin

这是我的代码,它采用1和0的4个字符串,并使用
位集
函数将其转换为十进制。它为所有组合返回正确的值,但涉及11和10的组合除外,如
{111010101011111}
。对于这些数字,它将返回忽略MSB的结果。也就是说,
1010
它给出了2作为答案

#include<bits/stdc++.h>
using namespace std;
#define ul unsigned long

int main(int argc, char const *argv[])
{
    int bin1=0,bin2=0,choice=0;
    ul x1=0,x2=0;
    //string binary;
    cin>>bin1;
    x1=bitset<4>(bin1).to_ulong();
    cin>>bin2;  
    x2=bitset<4>(bin2).to_ulong();
    cout<<x1<<" "<<x2<<endl;
    return 0;

}
#包括
使用名称空间std;
#定义ul无符号长
int main(int argc,char const*argv[]
{
int bin1=0,bin2=0,choice=0;
ul x1=0,x2=0;
//字符串二进制;
cin>>bin1;
x1=位集(bin1)。到_ulong();
cin>>bin2;
x2=位集(bin2)。到_ulong();

cout当您输入例如
1010
时,这是十进制值
1010
,二进制为
1111110010

这是初始化位集时使用的值。由于位集仅包含四位,因此将使用最低的四位,即
0010


简单的解决方案是将输入读取为字符串。

cout位集将其输入更改为二进制表示,因此0和1都是二进制的
二进制表示:

1010->1111110010

1100->10001001100

32位中只取4位(int通常有4个字节,4*8=32位),所以

1010->0010->十进制2

1100->1100->decimal 12

您需要位集构造函数的重载

template<class CharT, class Traits, class Alloc>

explicit bitset( const std::basic_string<CharT,Traits,Alloc>& str,
                 typename std::basic_string<CharT,Traits,Alloc>::size_type pos = 0,
                 typename std::basic_string<CharT,Traits,Alloc>::size_type n =
                     std::basic_string<CharT,Traits,Alloc>::npos,
                 CharT zero = CharT('0'),
                 CharT one = CharT('1'));
模板
显式位集(const std::basic_string和str,
typename标准::基本字符串::大小类型pos=0,
typename std::基本字符串::大小\u类型n=
std::basic_string::npos,
图表零=图表('0'),
图一=图('1');

从您的用例看,将
bin1
bin2
的类型更改为
std::string
可能会奏效。

我不知道您期望的是什么,但代码本身表达得足够清楚。我只提取了讨论所需的最低值:

int bin1=0;
cin>>bin1;
bin1
int
。您从
cin
读取一个
int
,而
int
1010
。它是壹仟零壹拾。这里不涉及位

在二进制中,
1010
(壹仟零壹拾)如下所示:
00000011110010

x1=bitset<4>(bin1).to_ulong();
x1=位集(bin1).to_ulong();
当使用
bin1
的值构造
位集时,仅使用
bin1
4
最右边(最低有效)位。这些位是
0010
,它们表示编号
2
x1
的值是
2

以类似的方式,从
cin
读取的
bin2
的值是
1110
壹仟壹佰壹拾),其二进制表示是
00000100 01010110
,其最右边的
4
位是
0110
,它们是整数
6
的二进制表示

代码完成了它应该做的事情;您的期望是不正确的


阅读。其中包含的示例有助于您理解差异。

您输入了什么?输出了什么?您希望输出什么?为什么?请阅读一条无关的注释,不要创建标准类型的类型别名。基本调试技巧:检查简化对问题的影响。相同的行为是否ior与硬编码输入一起出现,如
auto ten=“1010”
?这将从考虑中排除
std::cin
,并使您的问题变得独立。谢谢。现在就知道了。一点也不奇怪-它完全按照引用的文本所说的做,使用它给出的值的最后四位。@PeteKirkham:
s/weird/unexpected/
int bin1=0;
cin>>bin1;
x1=bitset<4>(bin1).to_ulong();