【问题标题】:Substring to Int C++子字符串到 Int C++
【发布时间】:2022-11-22 04:31:53
【问题描述】:

我正在尝试将只有 1 和 0 的字符串转换为十进制值。变量“value”被初始化为 0 并且永远不会更新。我怀疑问题是 binaryString[i] 被视为字符串,因此数学函数不起作用。我怎样才能解决这个问题?

void binaryToDec(string binaryString, int value)
{
  int binaryStringLength = binaryString.length();
  for (int i = 0; i < binaryStringLength; i++)
    {
      value += pow(2,i)+ binaryString[i];
    }
}

我尝试使用像 int(binaryString[i]) 这样的基本类型转换,但这不起作用。

【问题讨论】:

    标签: c++


    【解决方案1】:

    首先binaryString[i] 是一个字符,而不是一个整数。要将数字字符转换为整数,您只需减去'0'

    binaryString[i] - '0'
    

    其次,当您需要一个整数时,pow(2,i) 返回一个浮点数。这是低效的,更严重的是可能会出现舍入误差。相反,您应该使用移位运算符,它可以高效准确地计算 2 的整数次幂。

    1 << i
    

    第三,你有+,而你需要*。这两项应该相乘而不是相加。

    把所有这些放在一起你得到

    value += (1 << i) * (binaryString[i] - '0');
    

    但最严重的错误是您的函数没有返回值。它应该看起来像这样

    int binaryToDec(string binaryString)
    {
        int value = 0;
        ...
        return value;
    }
    

    您的版本将value作为参数传递,这是错误的方式,binaryString是参数,但value应该是回来从功能。不知道为什么,但这是很多新手都在努力解决的差异。

    【讨论】:

    • 关于位移位(或与此相关的乘法)的一个警告是您必须使用足够大的类型来表示字符串。如果字符串的长度为 48 个二进制数字,则您需要一个至少 48 位长的类型。通常 int 只有 32 位,如果空间不足,结果通常是可预测的——二进制补码溢出——但技术上要么是未定义的,要么是未指定的行为。规则最近发生了变化,我不能 100% 确定它是如何消失的,但无论哪种方式,你几乎肯定会得到错误的答案。
    猜你喜欢
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 2016-03-07
    • 2012-05-04
    • 1970-01-01
    相关资源
    最近更新 更多