例如:
string binaryValue = "11111111111111111111111111111011" // -5
我需要将此字符串转换为此数字的十进制表示形式。
stoi(binaryValue, nullptr, 2)
将在这种情况下抛出异常。那么我怎样才能在c ++中做到这一点? String或int无关紧要。
int std::stoi( const std::string& str, std::size_t* pos = 0, int base = 10 );
特别是:
[
str
]的有效整数值由以下部分组成:
- (可选)加号或减号
...
...
如果减号是输入序列的一部分,则从数字序列计算的数值将被否定,就像在结果类型中使用一元减号一样。
例外
std::invalid_argument
如果不能进行转换std::out_of_range
如果转换后的值超出结果类型的范围......
如果没有前面的减号,字符串:
std::string binaryValue = "11111111111111111111111111111011";
将在电话中解释:
std::stoi(binaryValue, nullptr, 2);
作为base-2表示中的非负整数值。但就这样,它超出范围,所以std::out_of_range
被抛出:
要将-5表示为std::stoi
调用将按预期转换的字符串,请使用:
std::string const binaryValue = "-101";
如果您不希望将减号前缀添加到非负的base-2数字,或者在现实情况下不能这样做,但希望使用"11111111111111111111111111111011"
API将std::sto*
解释为有符号整数的二进制补码表示,然后您必须首先将字符串转换为足够宽的类型的无符号整数,然后将该无符号值转换为有符号值。例如。
#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;
}
因为您可能知道数字存储为Twos补充 使用简单的伪代码转换它
翻转数字0-> 1,1-> 0从左到写,直到你找到字符串中的最后一个不切换这一个
这将是你的答案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;
}