2015-01-26 93 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