我正在处理一个函数,用于将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;
}
答案 0 :(得分:3)
将二进制数字字符串转换为整数的相对简单的方法是:
int result = 0;
for (int index = 0; index < binstr.length(); index++)
{
result *= 2;
result += (binstr[index] - '0');
}
此方法可用于任何基础,将2
替换为base
,最多10个 - 除了您需要将之前使用的任何其他字符转换为相关的“数字值”之前将其添加到结果中。
(请注意,上述内容比使用pow
效率要高得多,并且没有pow
给出的舍入错误的可能性,因为pow
通常被实现为{{ 1}},它倾向于提出诸如exp(log(base) * n);
而不是8和7.999999
insteaad为16的答案,当它转换为整数时会导致“有趣”的结果)
[显然,正确的转换需要检查溢出(数字太多),并且数字对于所选择的基数是“有效的”]
答案 1 :(得分:2)
当你应该在相反的方向工作时,你似乎是从左到右工作。您在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()
库函数是过度的 - 您可以使用按位运算符,例如改变:
dec += pow(2, count);
为:
dec += (1 << count);
这可以避免不必要的int-float转换和数学库调用。
答案 2 :(得分:0)
您正在向后处理二进制字符串 - 第一个数字的值为1(2 0 ),第二个数字为2(2 1 )等等。
如果你想采用这种方法,你应该向后反复字符串:
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 += ...
,而不是两者的组合。
答案 3 :(得分:0)
除上述评论外,您可能希望作业
dec += pow(2, count);
相反,或者可能
dec = (dec + pow(2, count));
祝你好运!