2011-06-30 11 views
0

私は現在C++の本を読んでおり、バイナリの数値(ユーザが入力したもの)を10進数に変換するように読者に要求するタスクがあります。これまでのところ、私は次のコードを持っていますが、すべて0が出力されます。何が間違っていたのでしょうか?C++のwhileループを使用したバイナリから10進数への変換

#include <iostream> 
using namespace std; 

int main() 
{ 
int x, b = 10, decimalValue = 0, d, e, f, count = 1, counter = 0; 
cout << "Enter a binary number: "; 
cin >> x; 
x /= 10; 
while(x > 0) 
{ 
count++; 
x = x/10; 
} 
while (counter < count) 
{ 
     if (x == 1) 
     { 
      f = 1; 
     } 
     else{ 
      f = x % b; 
     } 
     if (f != 0) 
     { 
      if (counter == 0) 
      { 
       decimalValue = 1; 
      } 
      else 
      { 
       e = 1; 
       d = 1; 
       while (d <= counter) 
       { 
        e *= 2; 
        d++; 
       } 
       decimalValue += e; 
      } 
     } 
     x /= b; 
     counter++; 
} 
cout << decimalValue << endl; 
system("pause"); 
return 0; 

}

答えて

2

場合x <= 0while(x > 0)ループのみ停止するので。また、cin >> xは、の小数点以下をと入力することができます。コードのそのビットの後

+0

Iはコードのその部分をチェックしています。それは、入力された数字に何桁の桁があるかを調べることだけです。 –

+0

@Emile:そうではありません。 'x = x/10;'ステートメントは、すべての反復で 'x'を0にリセットしてから値を失います。 –

+0

ああ..ありがとう:)。今すぐ修正しました。私はその部分を逃したと思います。 –

2

:私はいくつかのサンプルコードを書いた

int tmp = x; 

while(tmp > 0) 
{ 
    count++; 
    tmp = tmp /10; 
} 
+0

ループの中で 'tmp'を計算する方がよりエレガントです。それはその後の割り当てを保存します。 –

+0

@larsmans:agree – thumbmunkeys

2

while(x > 0) 
{ 
count++; 
x = x/10; 
} 

xは常に0ですが、あなたがcountを計算するために使用し、一時的な変数にxを置きます。あなたが私が何をしたのか理解できるかどうかを読んでみてください。混乱しているビットについて質問してください。

#include <iostream> 
#include <string> 
#include <cassert> 
#include <stdexcept> 
#include <limits> 

unsigned DecodeBinary(const std::string &sBin) 
{ 
    // check for a bad string 
    if (sBin.npos != sBin.find_first_not_of("01")) 
     throw std::invalid_argument("Badly formed input string"); 

    // check for overflow 
    if (sBin.length() > std::numeric_limits<unsigned>::digits) 
    { 
     throw std::out_of_range("The binary number is too big to " 
           "convert to an unsigned int"); 
    } 

    // For each binary digit, starting from the least significant digit, 
    // set the appropriate bit if the digit is not '0' 
    unsigned nVal = 0; 
    unsigned nBit = 0; 
    std::string::const_reverse_iterator itr; 
    for (itr=sBin.rbegin(); itr!=sBin.rend(); ++itr) 
    { 
     if (*itr == '1') 
      nVal |= (1<<nBit); 
     ++nBit; 
    } 
    return nVal; 
} 

int main() 
{ 
    try 
    { 
     std::cout << "Enter a binary number: "; 
     std::string sBin; 
     std::cin >> sBin; 

     unsigned nVal = DecodeBinary(sBin); 

     std::cout << "\n" << sBin << " converts to " << nVal << "\n"; 
     return 0; 
    } 
    catch (std::exception &e) 
    { 
     std::cerr << "\n\nException: " << e.what() << "\n"; 
     return 1; 
    } 
} 

最下位桁、インデックス0
インデックス3 2 1 0
と "1101"

スタートの入力を検討値1 1 0 1

それは " 1 "なので、出力のビット0を1(00000001 = 1)に設定します。

次の数字は0なので何もしません。
次の桁が '1' に設定ビット2がために1(00000101 = 5)
次の桁が '1' に設定ビット3がために1(00001101 = 13)

+0

ありがとうございました。私はまだC++を学んでいるので、理解できないコードのいくつかの側面があります。しかし、私はそれを試して、それは私のコードよりもはるかに良く働いた(私のコードは最大10桁の2進数しか受け入れることができませんでした)。私はすぐにそれをもっと深く見て、うまくいけば新しいものを学ぶでしょう! –

+0

OK。特定の質問がある場合は、ただ質問してください。 –

0

あります
1)小数=(0 < < 1)+ 1 = 1
:これを達成するために私が知っている最も簡単な方法は、以下のようになります。次のように例えば

int binaryToInteger(string binary) { 
    int decimal = 0; 
    for (char x : binary) { 
     decimal = (decimal << 1) + x - '0'; 
    } 
    return decimal; 
} 

を "101" に変換されます2)10進数=(1 < < 1)+ 0 = 2
3)小数=(2 < < 1)+ 1 = 5

関連する問題