这是从二进制字符串转换为十进制值的低效方法吗?

时间:2012-07-30 06:45:01

标签: c++ binary decimal

  while(i < length)
  {
    pow = 1;
    for(int j = 0; j < 8; j++, pow *=2)
    {   
      ch += (str[j] - 48) * pow;
    }   
    str = str.substr(8);
    i+=8;
    cout << ch; 
    ch = 0;
  }

这似乎让我的节目放慢了很多。是因为我在那里使用的字符串函数,或者这种方法通常是错误的。我知道有实现长除法的方法,但我想知道这是否实际上比这种方法更有效。我想不出另一种不使用相同通用算法的方法,所以也许只是我的实现就是问题。

5 个答案:

答案 0 :(得分:5)

也许你想要考虑使用标准库函数。它们可能至少与您通过编译器运行的任何内容一样优化:

#include <iostream>
#include <iomanip>
#include <cstdlib>

int main (void) {
    const char *str = "10100101";

    // Use str.c_str() if it's a real C++ string.
    long int li = std::strtol (str, 0, 2);

    std::cout
        << "binary string = " << str
        << ", decimal = " << li
        << ", hex = " << std::setbase (16) << li
        << '\n';
    return 0;
}

输出结果为:

binary string = 10100101, decimal = 165, hex = a5

答案 1 :(得分:1)

你正在做一些不必要的事情,比如为每个循环创建一个新的子字符串。您可以改为使用str[i + j]

也没有必要将0或1乘以功率。只需使用if语句。

  while(i < length)
  {
     pow = 1;
     for(int j = 0; j < 8; j++, pow *=2)
     { 
         if (str[i + j] == '1')
            ch += pow;
     }
     i+=8; 
     cout << ch; 
     ch = 0; 
  } 

这至少会跑得快一点。

答案 2 :(得分:0)

简短回答可能是:

long int x = strtol(your_binary_c++_string.c_str(),(char **)NULL,2)

可能你可以使用int或long int,如下所示:

一步一步地遍历二进制数,从0开始到n-1,其中n是最高有效位(MSB), 将它们与2相加,然后将总和相加。例如,要转换1000(二进制等效值为8),只需执行以下操作

1 0 0 0 ==&gt;从右到左

0 x 2 ^ 0 = 0 0 x 2 ^ 1 = 0; 0 x 2 ^ 2 = 0; 1 x 2 ^ 3 = 8; 现在将它们加在一起,即0 + 0 + 0 + 8 = 8;这个十进制相当于1000.请阅读下面的程序,以便更好地理解这个概念 工作。注意:该程序仅适用于16位二进制数(非浮动)或更少。如果有任何不清楚的地方发表评论。你一定会收到回复。

//将二进制转换为十进制等值的程序

#include <iostream>
#include <math.h>

int main()
{
     int x;
     int i=0,sum = 0;
     // prompts the user to input a 16-bit binary number
     std::cout<<" Enter the binary number (16-bit) : ";
     std::cin>>x;

     while ( i != 16 ) // runs 16 times
     {
          sum += (x%10) * pow(2,i);
          x = x/10;
          i++;
     }
     std::cout<<"\n The decimal equivalent is : "<<sum;
     return 0;
}

答案 3 :(得分:0)

最大限度地减少操作次数,不要多次计算。只需乘以并向上移动:

unsigned int result = 0;

for (char * p = str; *p != 0; ++p)
{
    result *= 2;
    result += (*p - '0');  // this is either 0 or 1
}

该方案很容易推广到任何基础&lt; 10。

答案 4 :(得分:0)

如下:

int binstring_to_int(const std::string &str)
{
    // 16 bits are 16 characters, but -1 since bits are numbered 0 to 15
    std::string::size_type bitnum = str.length() - 1;
    int value = 0;

    for (auto ch : str)
    {
        value |= (ch == '1') << bitnum--;
    }

    return value;
}

这是我能想到的最简单的。请注意,这使用新的C ++ 11 for-each循环结构,如果编译器无法处理它,则可以使用

for (std::string::const_iterator i = str.begin(); i != str.end(); i++)
{
    char ch = *i;
    // ...
}