Преобразование двоичного в десятичное с использованием цикла while в C ++ - PullRequest
0 голосов
/ 30 июня 2011

Я сейчас читаю книгу на 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 ]

2 голосов
/ 30 июня 2011

После этого бита кода:

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

x всегда равен 0, поэтому поместите x во временную переменную, которую вы используете для вычисления count:

int tmp = x;

while(tmp  > 0)
{
   count++;
   tmp  = tmp /10;
}
2 голосов
/ 01 июля 2011

Я написал пример кода. Прочитайте и посмотрите, сможете ли вы понять, что я сделал. Задавайте вопросы о любых путаницах.

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

2 голосов
/ 30 июня 2011

Поскольку цикл while( x > 0) останавливается только при x <= 0. Кроме того, cin >> x позволяет пользователю вводить десятичное число.

0 голосов
/ 30 июля 2013

Простейший способ, которым я знаю для достижения этой цели, будет следующий:

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

Например, «101» будет преобразовано следующим образом:
1) десятичное = (0 << 1)+ 1 = 1 <br>2) десятичный = (1 << 1) + 0 = 2 <br>3) десятичный = (2 << 1) + 1 = 5 <br>

...