2015-01-26 64 views
-1

我正在研究将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; 
} 
+1

您似乎将最左边的位视为最不重要最右边的比特是最重要的,这比通常使LS比特位于右边的惯例更向后。 – 2015-01-26 22:52:31

+2

因为什么时候是'int' * decimal *?另外,在这里使用'pow'(因此是浮点)是一个非常糟糕的主意。 – Deduplicator 2015-01-26 22:53:23

+0

我也这么认为,并试图扭转我挣扎的那串,然后它没有修复它。当我输入0001时,输出是8,因此你是对的,但是如果我输入1111,我得到32,所以我知道我也在做其他错误。 – budroothedog 2015-01-26 22:55:32

回答

2

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

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-浮点转换和数学库调用。

+0

感谢您的帮助,删除额外的+ dec dec我。 – budroothedog 2015-01-26 23:08:08

0

你向后处理二进制串 - 第一个数字给出的1(2 0 )的值,为2秒(2 )等

如果要采取这种方法,你应该迭代字符串向后

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

注:
随着P aulR在评论中指出,你自己加了两次dec。您应该使用dec = dec + ...dec += ...,而不是两者的组合。

+1

@PaulR arg,对。来自OP代码的过度热忱的复制粘贴。固定。 – Mureinik 2015-01-26 22:59:58

0

随着上述意见,你可能想分配是

dec += pow(2, count); 

代替,或者可能

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

祝你好运!

3

A到的二进制数字的字符串转换为整数比较简单的方法是这样的:

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

这种方法可用于任何的基础上,与base替换2,最多10 - 超出你在将其添加到结果之前,需要将使用的其他字符转换为相关的“数字值”。

(注意,上面的是显著比使用pow,以及不具有用于舍入的错误,pow给出了潜在更高效,因为pow常常是作为exp(log(base) * n);实现,这趋向于想出答案如7.999999代替8和16.000001 insteaad 16,导致“有趣”的结果时,它被转换为一个整数)

[显然一个适当的转换将需要检查溢出(数字太多),数字是“有效”的基地选择]

+0

我不敢相信你是唯一不会使用'pow()'函数的解决方案。 – ErikR 2015-01-26 23:07:57

+0

@ user5402:增加了评论来澄清不使用'pow'的原因。 – 2015-01-26 23:11:54