n位2s二进制到十进制,C++; 我试图用STOI将一个有符号二进制数串转换成C++中的十进制值,如下所示。p> stoi( binaryString, nullptr, 2 );

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,正确的

我的输入是2s格式的二进制字符串,只要位数是8,stoi就可以正常工作。例如,“1100”结果12,因为stoi可能认为它是“000011100”


但对于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;
}