Как я могу изменить вывод программы? - PullRequest
2 голосов
/ 20 октября 2011

Мне нужно преобразовать десятичные числа, такие как 43,62, в двоичные.Итак, я сначала написал базовую программу, которая конвертирует 43 в двоичный файл.Но я замечаю, что моя программа печатает двоичное число в обратном порядке, поэтому печатает 1 1 0 1 0 1 вместо 1 0 1 0 1 1. как я могу это исправить.

Мой код:

#include <iostream>

using namespace std;

int main()
{
    int number;
    int remainder;

    cout << "Enter a integer: ";
    cin >> number;

    while(number != 0)
    {
        remainder = number % 2;
        cout << remainder << " ";
        number /= 2;
    }

    int pause;
    cin >> pause;

    return 0;
}

Ответы [ 9 ]

3 голосов
/ 20 октября 2011

Вместо отправки каждой цифры в cout, отправьте их в массив.Затем прочитайте массив в обратном порядке.Или поместите их в стек, а затем вытолкните их обратно из стека.Или ...

2 голосов
/ 20 октября 2011

Что-то вроде кувалды, чтобы расколоть орех, но вот решение, основанное на рекурсивном подходе:

#include <iostream>
using namespace std;

void OutputDigit(int number)
{
    if (number>0)
    {
        OutputDigit(number /= 2);
        cout << number % 2 << " ";
    }
}

int main()
{
    OutputDigit(43);
    return 0;
}

Вы можете получить тот же вывод, что и раньше, просто переместив cout на одну строку вверх!

1 голос
/ 20 октября 2011

Посмотрите на vector и подумайте о том, как было бы полезно сохранить остатки, а не распечатывать их сразу.

Обратите внимание, что вам не нужно помещать объекты в конец вектора.vector::insert позволяет вам указать позицию ... это может быть полезно?

В качестве альтернативы, созданный вами алгоритм начинается с наименее значащей цифры.Есть ли способ начать с самой значимой цифры?Если у меня есть число 42 (0101010), наиболее значимая цифра представляет 32-е, а 0 перед ним представляет 64-е.Что произойдет, если я вычту 32 из 42?

0 голосов
/ 16 августа 2017

Лучший вариант - использовать C ++ stringstream для форматирования ввода / вывода

// Add the following headers
    #include <sstream>
    #include <algorithm>

    // your function

    stringstream ss;

    // Use ss in your code instead of cout


    string myString = ss.str();
    std::reverse(myString.begin(),myString.end());
    cout << myString;
0 голосов
/ 20 октября 2011

Когда вы делаете такое преобразование, удерживая остаток, результат всегда будет возвращен. Как предлагается использовать bitwise &:

unsigned char bit = 0x80; // start from most significant bit
int  number = 43;
while(bit)
{
    if( bit & number ) // check if bit is on or off in your number
    {
       cout << "1";
    }
    else
    {
       cout << "0";
    }
    bit = bit >>1; // move to next bit
}

В этом примере начнется просмотр всех ваших 8 битов числа, и будет проверен, включен ли бит или выключен, и выведите его соответствующим образом.

0 голосов
/ 20 октября 2011

Просто используйте строковые функции

string s ;

while(number != 0)
{
    remainder = number % 2;
    string c = remainder ? "1": "0";
    s.insert(s.begin(),c.begin(),c.end());
    number /= 2;
}
0 голосов
/ 20 октября 2011

В C ++ вы также можете использовать битовый контейнер для этого,

#include <bitset>

int i = 43;
std::bitset<sizeof(int)*CHAR_BIT> bin(i);
0 голосов
/ 20 октября 2011

Первый значащий бит:

const unsigned int BITS_PER_INT = CHAR_BIT * sizeof(int);
char bit_char = '0';
for (int i = BITS_PER_INT - 1;
     i > 0;
     --i)
{
    bit_char = (value & (1 << i)) ? '1' : '0';
    cout << bit_char << ' ';
}
cout << '\n';
cout.flush();

Чтобы сначала печатать младший значащий бит, измените направление цикла for.

0 голосов
/ 20 октября 2011

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

...