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