在C ++中使用while循环将二进制转换为十进制

时间:2011-06-30 19:50:05

标签: c++ binary decimal while-loop

我目前正在阅读一本关于C ++的书,有一项任务要求读者将二进制数(由用户输入)转换为十进制等值。到目前为止,我有以下代码,但它只是输出0.任何想法出了什么问题?

#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;

}

4 个答案:

答案 0 :(得分:2)

因为while( x > 0)循环仅在x <= 0时停止。此外,cin >> x允许用户输入十进制号。

答案 1 :(得分:2)

在那段代码之后:

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

x始终为0,因此将x放入用于计算count的临时变量中:

int tmp = x;

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

答案 2 :(得分:2)

我写了一些示例代码。阅读并看看你是否能理解我所做的一切。询问有关令人困惑的任何问题的问题。

#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;
    }
}

考虑输入“1101”

  

从最低有效数字开始,索引0
  指数3 2 1 0
  值1 1 0 1

     

为“1”,输出的第0位设为1(00000001 = 1)。

     

下一个数字是零,所以什么都不做   下一个数字是'1',因此将第2位设置为1(00000101 = 5)
  下一个数字是'1',因此将第3位设置为1(00001101 = 13)

答案 3 :(得分:0)

我知道实现这一目标的最简单方法如下:

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

例如,“101”将按如下方式转换:
    1)十进制=(0 <&lt; 1)+ 1 = 1
    2)十进制=(1 <&lt; 1)+ 0 = 2
    3)十进制=(2 <&lt; 1)+ 1 = 5