n位2s二进制到十进制,C++; 我试图用STOI将一个有符号二进制数串转换成C++中的十进制值,如下所示。p> stoi( binaryString, nullptr, 2 );
我的输入是2s格式的二进制字符串,只要位数是8,stoi就可以正常工作。例如,“1100”结果12,因为stoi可能认为它是“000011100”n位2s二进制到十进制,C++; 我试图用STOI将一个有符号二进制数串转换成C++中的十进制值,如下所示。p> stoi( binaryString, nullptr, 2 );,c++,binary,decimal,twos-complement,C++,Binary,Decimal,Twos Complement,我的输入是2s格式的二进制字符串,只要位数是8,stoi就可以正常工作。例如,“1100”结果12,因为stoi可能认为它是“000011100” 但对于4位系统,2s格式的1100等于-4。在C++中,如何对任意位长度2s数进行这种转换?p> 您可能可以实现 < C++ >代码> > < >代码>二进制字符串, n< /代码>为代码>二进制字符串。siz()/和代码> w >代码>。 可以使用 StrutL< /COD>,这是无符号等价。唯一的区别是它返回一个无符号长,而不是int,正确的
但对于4位系统,2s格式的1100等于-4。在C++中,如何对任意位长度2s数进行这种转换?p> 您可能可以实现
< C++ >代码> > < <代码> >代码>二进制字符串,<代码> n< /代码>为代码>二进制字符串。siz()/<代码>和<>代码> w >代码>。 可以使用<代码> StrutL< /COD>,这是无符号等价。唯一的区别是它返回一个
无符号长
,而不是int
,正确的答案可能取决于在转换int之后您最终想要对它做什么。如果你想用它做有符号数学,那么你需要在stoi转换后对结果进行“符号扩展”——这是编译器在内部对从一个大小有符号int到另一个大小有符号int的转换操作所做的
对于4位系统,您可以手动执行以下操作:
int myInt;
myInt = std::stoi( "1100", NULL, 2);
myInt |= myInt & 0x08 ? (-16 ) : 0;
注意,我使用0x08作为测试掩码,-16作为or掩码,因为这是一个4位结果。您可以将掩码更改为适合任何输入位长度的掩码。无论系统的整数大小是多少,使用像这样的负整数也将正确地对扩展进行符号化
任意位宽度系统的示例(我使用位宽度表示大小:
myInt = std::stoi( "1100", NULL, 2);
int bitWidth = 4;
myInt |= myInt & (1 << (bitWidth-1)) ? ( -(1<<bitWidth) ) : 0;
myInt=std::stoi(“1100”,空,2);
int比特宽度=4;
myInt |=myInt&(1处理位数较少的数字的sigendness:
- 转换二进制->十进制
- 如果设置了有符号位,则计算2s补码(符号位取决于字长)
#定义位大小4
#定义SIGNFLAG(1您可以为此使用位集头文件:
#include <iostream>
#include <bitset>
using namespace std;
int main()
{
bitset<4> bs;
int no;
cin>>bs;
if(bs[3])
{
bs[3]=0;
no=-1*bs.to_ulong();
}
else
no=bs.to_ulong();
cout<<no;
return 0;
}
#包括
#包括
使用名称空间std;
int main()
{
比特集;
国际贸易编号;
cin>>bs;
如果(bs[3])
{
bs[3]=0;
否=-1*bs.to_ulong();
}
其他的
否=bs.to_ulong();
如果设置了高位,是否可以表示赞扬?~val和-1或只是-val。
#include <iostream>
#include <bitset>
using namespace std;
int main()
{
bitset<4> bs;
int no;
cin>>bs;
if(bs[3])
{
bs[3]=0;
no=-1*bs.to_ulong();
}
else
no=bs.to_ulong();
cout<<no;
return 0;
}