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

问题描述 投票:2回答:2

例如:

string binaryValue = "11111111111111111111111111111011" // -5

我需要将此字符串转换为此数字的十进制表示形式。

stoi(binaryValue, nullptr, 2)

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

c++ binary twos-complement
2个回答
1
投票

the documentation

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";

Live demo

如果您不希望将减号前缀添加到非负的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;
}

Live demo


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;


     }  

https://onlinegdb.com/SyFYLVtdf预览

© www.soinside.com 2019 - 2024. All rights reserved.