2016-09-27 7 views
-1

Итак, я видел следующее решение для двоичного преобразования в десятичное целое, и я вижу, что он работает, но я бы очень хотел понять теорию алгоритма.Теория преобразования двоичных чисел в десятичные числа

#include<iostream> 
using namespace std; 

int main() 
{ 
    long bin, dec = 0, rem, num, base = 1; 

    cout << "Enter the binary number(1s and 0s) : "; 
    cin >> num; 
    bin = num; 
    while (num > 0) 
    { 
     rem = num % 10; 
     dec = dec + rem * base; 
     base = base * 2; 
     num = num/10; 
    } 
    cout << "The decimal equivalent of " << bin << " : " << dec << endl; 
    return 0; 
} 

Таким образом, мы добавляем оставшуюся часть сдвинутого ввода и умножив его на основании положения, но я не очень понимаю, как это заканчивается добавление к правильному ответу.

Сообщите мне, если есть что-нибудь, что я могу предоставить, чтобы помочь.

Благодаря

+2

Вы должны пройти через код с помощью отладчика, чтобы вы могли видеть, как он работает. Или сделайте это на карандаше и бумаге. Это должно дать вам лучшее представление о том, что происходит. – NathanOliver

+2

Правильный инструмент для решения таких проблем - ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –

+2

Подсказка: на самом деле 'cin >> num' считывает десятичное числовое представление с пользовательского ввода, а не двоичное представление. Это выглядит очень сложным способом для чтения двоичного представления 'std :: string' и передать его в конструктор' 'std :: bitset''. –

ответ

1

В начале num содержит двоичное представление числа, но это основа 10 номера (например: 1011 тысячи и одиннадцать).

Строка rem = num % 10; принимает последнюю значащую цифру псевдо двоичного числа, используя напоминание о делении на десятичный 10 (десять).

dec = dec + rem * base; добавить вес цифры (базы) в десятичном представлении.

base = base * 2; Обновить вес следующей цифры (1,2,4,8, ...).

num = num/10; отбросить последнюю цифру двоичного представления, эквивалентную 1-значной сдвигу вправо.

0

В любом основании число равно сумме его цифр, каждая из которых имеет вес основания.

Например, в десятичной базе, 4734 = 4.10³ + 7.10² + 3.10 + 4.1. Эта формула позволяет конвертировать из цифр в внутреннее целочисленное представление. Вы можете сделать это справа налево, сохраняя временную переменную с текущей мощностью базы (1, 10, 100 ...).

Обратная операция, целое число, чтобы цифры, достигаются следующим образом:

  • последней цифрой является число по модулю 10, то есть 4734% 10 = 4
  • номер с последней цифрой упал является фактор по 10, то есть 4734/10 = 473.

в данном алгоритме, вход фактически десятичное число только с цифрами 0/1. Алгоритм извлекает цифры один за другим справа налево (основание 10) и рекомбинирует их как двоичное число во внутреннем представлении.

Например,

1100 дает цифры от 1, 1, 0, 0, рекомбинируют с полномочиями 1, 2, 2² = 4, 2³ = 8, что дает общее 4 + 8 = 12.


на самом деле, cout оператор будет выполнить двоичное-к-десятичное преобразование, которое дает цифру 2, 1 и выводить их, наоборот.