将负二进制数转换为十进制

Convert negative binary number to decimal

例如:

string binaryValue = "11111111111111111111111111111011" // -5

我需要将这个字符串转换成这个数字的十进制表示形式。

stoi(binaryValue, nullptr, 2)

在这种情况下会抛出异常。那么我怎么能在 C++ 中做到这一点呢? String 或 int 无关紧要。

你可能知道数字存储为二进制补码
使用简单的伪代码转换它

flip numbers 0->1, 1->0 from left to write util you find last 1 in string don't toggle this one

这就是你的答案 0000000000000000000000000101=5


这是来自 https://www.geeksforgeeks.org/efficient-method-2s-complement-binary-string/

的代码
#include<bits/stdc++.h>
using namespace std;


string findTwoscomplement(string str)
{


  int n = str.length();


// Traverse the string to get first '1' from
// the last of string
int i;
for (i = n ; i >= 0 ; i--)
    if (str[i] == '1')
        break;

// If there exists no '1' concat 1 at the
// starting of string
if (i == 0)
    return '1' + str;

// Continue traversal after the position of
// first '1'
for (int k = i-1 ; k >= 0; k--)
{
    //Just flip the values
    if (str[k] == '1')
        str[k] = '0';
    else
        str[k] = '1';
}

// return the modified string
return str;;
}



int main()
{
    string str = "11111111111111111111111111111011";
    cout << findTwoscomplement(str);
//now you convert it to decimal if you want
    cout<<"Hello World";
    cout << stoul( findTwoscomplement(str),nullptr,2);
        return 0;


     }  

预览于 https://onlinegdb.com/SyFYLVtdf

参见 the documentation 的:

int  std::stoi( const std::string& str, std::size_t* pos = 0, int base = 10 );

特别是:

The valid integer value [of str] consists of the following parts:

  • (optional) plus or minus sign

...

...

If the minus sign was part of the input sequence, the numeric value calculated from the sequence of digits is negated as if by unary minus in the result type.

Exceptions

  • std::invalid_argument if no conversion could be performed

  • std::out_of_range if the converted value would fall out of the range of the result type...

如果前面没有 minus-sign,则字符串:

std::string binaryValue = "11111111111111111111111111111011";

将在调用中解释:

std::stoi(binaryValue, nullptr, 2);

作为一个 non-negative 以 2 进制表示的整数值。但正因如此, 它超出了范围,所以 std::out_of_range 被抛出:

要将 -5 表示为您的 std::stoi 调用将按预期转换的字符串, 使用:

std::string const binaryValue = "-101";

Live demo

如果您不想在 non-negative base-2 数字前加上减号前缀,或者在您的 real-world 中不能这样做 情况,但希望解释 "11111111111111111111111111111011" 作为有符号整数的二进制补码表示,使用 std::sto* API, 那么您必须首先将字符串转换为 unsigned 整数 wide-enough 类型,然后将该无符号值转换为有符号值。例如

#include <string>
#include <iostream>

int main()
{
    auto ul = std::stoul("11111111111111111111111111111011",nullptr,2);
    std::cout << ul << std::endl;
    int i = ul;
    std::cout << i << std::endl;
    return 0;
}

Live demo