📜  c++ stoi 二进制负数字符串转十进制 - C++ (1)

📅  最后修改于: 2023-12-03 15:29:51.411000             🧑  作者: Mango

C++ stoi 二进制负数字符串转十进制

在C++中,我们可以使用stoi函数将字符串转换为整数。但是当字符串是二进制负数时,我们需要对其进行一些特殊处理才能将其正确地转换为十进制。

二进制补码表示法

在学习如何将二进制负数字符串转换为十进制之前,我们需要先了解二进制补码表示法。在二进制补码表示法中,正数的表示方式与普通的二进制表示法相同,而负数的表示方式则为其对应的正数的反码加1。

例如,-5在二进制补码表示法中的表示方式为:将5换算成二进制为101,其反码为010,再将其加1得到011,因此-5在二进制补码表示法中的表示方式为:11111011。

代码实现

在使用stoi函数将二进制负数字符串转换为十进制的过程中,我们需要先对其进行转换,将其转换为二进制补码表示的十进制数,再将其转换为普通的十进制数。

以下是C++代码的示例:

#include <iostream>
#include <string>

using namespace std;

int binaryToDecimal(string n)
{
    if(n[0] == '1') //如果字符串是负数
    {
        //先将其转换为二进制补码
        for(int i=0; i<n.length(); i++)
        {
            if(n[i] == '0') n[i] = '1';
            else n[i] = '0';
        }

        int i = n.length()-1;
        while(i >= 0 && n[i] == '1')
        {
            n[i] = '0';
            i--;
        }
        if(i >= 0) n[i] = '1';

        //再将补码转换为十进制
        int decimal = stoi(n, nullptr, 2);
        return decimal*(-1);
    }
    else
    {
        //如果字符串是正数则直接转换为十进制
        int decimal = stoi(n, nullptr, 2);
        return decimal;
    }
}

int main()
{
    string binary = "1101"; //表示-3
    int decimal = binaryToDecimal(binary);
    cout << decimal << endl; //-3

    return 0;
}

在上面的代码中,我们首先定义了一个名为binaryToDecimal的函数,该函数接受一个二进制字符串,并返回其对应的十进制数。在函数中,我们首先判断字符串是否为负数,如果是,则将其转换为补码表示的二进制数,并将其转换为十进制数,最后将其乘以-1即可得到其对应的负数十进制数。

如果字符串是正数,则直接将其转换为十进制数返回即可。

main函数中,我们定义了一个二进制字符串,表示-3。然后调用binaryToDecimal函数将其转换为十进制数,并输出结果。

总结

在C++中,通过使用stoi函数,我们可以方便地将二进制字符串转换为十进制数。但是当字符串是二进制负数时,我们需要先将其转换为补码表示的二进制数,并将其转换为十进制数,最后将其乘以-1得到其对应的负数十进制数。