将负二进制数转换为十进制
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;
}
参见 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";
如果您不想在 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;
}
例如:
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;
}
参见 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";
如果您不想在 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;
}