读取二进制数

Reading a binary number

本文关键字:二进制数 读取      更新时间:2023-10-16

我正在研究一个函数,将二进制数从std::string解析为int。不知何故,它失败了。

int bin2dec(string &binstr)
 {
  unsigned int count = 0;
  int dec = 0;
  while (count < binstr.size()) {
    if(binstr[count] == '1') {
        dec += (dec + pow(2, count));
    } 
    count++;
   }
  return dec;
 }

将二进制数字字符串转换为整数的一个相对简单的方法是:

int result = 0;
for (int index = 0; index < binstr.length(); index++)
{
    result *= 2;
    result += (binstr[index] - '0');
}

此方法可用于任何基数,将2替换为 base ,最多 10 个 - 除此之外,您需要将任何其他字符转换为相关的"数字值",然后再将其添加到结果中。

(请注意,上述方法比使用 pow 更有效,并且没有pow给出的舍入误差的可能性,因为pow通常以 exp(log(base) * n); 的形式实现,这往往会产生诸如 7.999999 而不是 8 和 16.000001 的 insteaad of 16 这样的答案,当它转换为整数时会导致"有趣"的结果)

[显然,正确的转换需要检查溢出(太多数字)并且数字对于所选的基础是否"有效"]

当你应该朝相反的方向工作时,你似乎在从左到右工作。您在第 dec += (dec + pow(2, count)); 行中也有一个错误,因为您在此处添加了两次dec。修复代码的一种可能方法:

int bin2dec(string &binstr)
{
    int count = 0;
    int dec = 0;
    while (count < binstr.size())
    {
        if (binstr[binstr.size() - index - 1] == '1')
        {
            dec += pow(2, count); // <<< bug fix here
        }
        count++;
    }
    return dec;
}

请注意,使用浮点pow()库函数是矫枉过正的 - 你可以只使用按位运算符,例如 change:

            dec += pow(2, count);

自:

            dec += (1 << count);

这避免了不必要的 int-float 转换和数学库调用。

除了上面的评论,您可能希望作业是

dec += pow(2, count);

相反,或者可能

dec = (dec + pow(2, count));

祝你好运!

您正在向后处理二进制字符串 - 第一个数字的值为 1 (20),第二个数字的值为 2 (21),依此类推。

如果要采用此方法,则应向后迭代字符串:

int dec = 0;
for (int i = binstr.size() - 1; i >= 0; --i) {
  if(binstr[count] == '1') {
      dec += pow (2, i);
  } 
  count++;
}

注意:
正如PaulR在评论中指出的那样,你两次将dec添加到自身。您应该使用 dec = dec + ...dec += ... ,而不是两者的组合。