C++ 这是将二进制字符串转换为十进制值的低效方法吗? while(i从右向左移动

C++ 这是将二进制字符串转换为十进制值的低效方法吗? while(i从右向左移动,c++,binary,decimal,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; }

也许您希望研究使用标准库函数。它们可能至少与您在编译器中运行的任何函数一样优化:

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

也许您希望研究使用标准库函数。它们可能至少与您在编译器中运行的任何函数一样优化:

  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;
  }
简单的回答可以是:

binary string = 10100101, decimal = 165, hex = a5
可能您可以使用int或long int,如下所示:

只需从0到n-1逐步遍历二进制数,其中n是最高有效位(MSB), 用升幂将它们与2相乘,然后将总和相加。例如,要转换1000(相当于8的二进制数),只需执行以下操作

1 0 0==>从右向左移动

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

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

long int x = strtol(your_binary_c++_string.c_str(),(char **)NULL,2)
#包括
#包括
int main()
{
int x;
int i=0,sum=0;
//提示用户输入16位二进制数
std::coutx;
而(i!=16)//运行16次
{
总和+=(x%10)*功率(2,i);
x=x/10;
i++;
}
std::cout简短的回答可以是:

binary string = 10100101, decimal = 165, hex = a5
可能您可以使用int或long int,如下所示:

只需从0到n-1逐步遍历二进制数,其中n是最高有效位(MSB), 用升幂将它们与2相乘,然后将总和相加。例如,要转换1000(相当于8的二进制数),只需执行以下操作

1 0 0==>从右向左移动

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

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

long int x = strtol(your_binary_c++_string.c_str(),(char **)NULL,2)
#包括
#包括
int main()
{
int x;
int i=0,sum=0;
//提示用户输入16位二进制数
std::coutx;
而(i!=16)//运行16次
{
总和+=(x%10)*功率(2,i);
x=x/10;
i++;
}

std::cout尽量减少运算次数,不要多次计算。只需乘以并向上移动:

#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;
}

该方案很容易推广到任何基最小化运算次数,且计算次数不超过一次。只需乘以并向上移动:

#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;
}

该方案很容易推广到任何基础那么类似于:

unsigned int result = 0;

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

比如说:

unsigned int result = 0;

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

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

也不需要将0或1乘以幂。只需使用if语句即可

for (std::string::const_iterator i = str.begin(); i != str.end(); i++)
{
    char ch = *i;
    // ...
}
while(icout您正在做一些不必要的事情,比如为每个循环创建一个新的子字符串。您可以使用
str[i+j]

也不需要将0或1乘以幂。只需使用if语句即可

for (std::string::const_iterator i = str.begin(); i != str.end(); i++)
{
    char ch = *i;
    // ...
}
while(i你能详细解释一下原因吗?我不需要你给我一个实现,但如果纯粹出于教学目的,我想了解istringstream在效率方面提供了哪些好处以及原因。我不知道istringstream的实际实现,我认为可能会有所不同,但我非常担心这是真的y硬位
std::
性能。也是最好的(也是唯一的)衡量绩效的方法是概述您是否愿意详细说明原因?我不需要您给我一个实现方案,但如果纯粹出于教学目的,我想了解istringstream在效率方面提供了哪些好处以及原因。我不知道istringstream的实际实现,我认为可能有所不同,但我不知道我高度关注的是,比特
std::
性能真的很难。也是最好的(也是唯一的)衡量性能的方法是分析性能。除了性能,使用标准库的另外两个好处是,由于没有重新发明轮子,减少了错误,提高了程序员的工作效率。除了性能,使用标准库的另外两个好处是,由于没有重新发明轮子,减少了错误,提高了程序员的工作效率。