2017-02-21 74 views
4

Я натолкнулся на следующий код C++ в InterviewBit для десятичного двоичного преобразования, как показано на рисунке ниже.Как работает следующий десятичный код двоичного преобразования?

class Solution{ 

public: 
    string findDigitsInBinary(int n){ 
    string ans; 
    if(n == 0) return "0"; 

    while(n > 0){ 
     int rem = n % 2; 
     ans.push_back((char)('0' + rem)); 
     n /= 2; 
    } 

    reverse(ans.begin(), ans.end()); 
    return ans; 
    } 
}; 

Я не могу понять, что происходит во втором утверждении цикла while.

ans.push_back((char)('0' + rem)); 

Это моя интерпретация этого кода.

Предположим, я считать значение п в 5.

  • Теперь для первой итерации цикла, в то время как 5> 0.

  • бэр = 5% 2 = 1;

  • В строке ans «0» + 1 (rem), то есть «01» будет сохранен.

  • п = 5/2 = 2

  • Теперь, для второй итерации, 2> 0.

  • бэр = 2% 2 = 0

  • ANS = "01" (уже сохранены) + '0' + '0' (бэр) => "0100"

  • п = 2/2 = 1

  • В заключительной итерации, 1> 0.

  • бэр = 1% 2 = 1

  • ANS = "0100" + '0' + 1 (бэр) => "010001"

  • п = 1/2 = 0

  • Теперь, обратив внимание на ответ, оно станет => 100010, но это неправильный ответ.

Итак, может кто-нибудь объяснить, где я ошибаюсь?

+0

очень хорошо поставленный вопрос. –

+1

с 'rem = n% 2;' поэтому он может быть либо '0', либо' 1', 'ans.push_back()' будет принимать 'char', и с этим символом вы либо добавляете' 0', к нему или '1'. ''0' + 0' дает' '0'' и '' 0 '+ 1' дает' '1''. –

ответ

4

'0' + rem не делать то, что вы думаете: '0' является char буквальным и rem является int значение. Добавление их вместе приведет к int, который представляет значение ASCII либо '0', либо '1'.

Дополнительная информация: "Convert an int to ASCII character"