C++ 为什么bitset函数不能为二进制字符串(如1110或1011)返回正确的十进制值?
这是我的代码,它采用1和0的4个字符串,并使用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
位集
函数将其转换为十进制。它为所有组合返回正确的值,但涉及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();