Преобразование десятичного числа в двоичное с использованием показателей степени

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

Я попытался найти обычное двоичное сравнение, но оно дает мне неправильный порядок, скажем, правильный порядок 1001100, я просто получаю 0011001. и у меня нет возможности изменить порядок. Мне не разрешено использовать любую другую библиотеку, кроме iostream, cmath и string. Сейчас я пытаюсь просто найти преобразование, используя показатель степени 2 ^ показатель степени.

Это то, что у меня есть на данный момент:

int num, exp,rem;

string biNum;

cout<<"Enter decimal number: "<<endl;
cin>>num;

for (exp = 0; pow(2, exp) < num; exp++) {
}

while (num > 0) {
    rem = num % (int) pow(2, exp);
    if (rem != 0) {
            biNum = biNum + '1';
    } else {
            biNum = biNum + '0';
    }
    exp--;
    }
cout<<biNum;
return 0;

}

В настоящее время я не получаю никакого результата.


person Knarz    schedule 07.08.2019    source источник
comment
Не используйте pow(2, X), так как у него много накладных расходов. Вместо этого используйте сдвиг влево: (1 << X). Многие процессоры могут реализовать сдвиг влево за одну или две инструкции.   -  person Thomas Matthews    schedule 07.08.2019
comment
Вы можете использовать побитовое И для проверки битовых позиций, а не оператор остатка, '%'. Опять же, операция И — это обычно 1 инструкция или еще пара (для загрузки регистров значениями).   -  person Thomas Matthews    schedule 07.08.2019
comment
Ожидаемое решение этой задачи не будет использовать pow(), который представляет собой дорогостоящее вычисление с плавающей запятой, не имеющее смысла, которое используется для выполнения простых целочисленных вычислений, которые легко выполняются с использованием примитивов со сдвигом битов. Не говоря уже о том, что математика с плавающей точкой не работает. Я могу в значительной степени гарантировать вам, что тот, кто попросил вас написать это, отвергнет такое решение. В вашей книге по C++ будет больше информации о различных видах операций побитового сдвига, которые возможны в C++.   -  person Sam Varshavchik    schedule 07.08.2019
comment
Как обычно в этих вопросах, единственное преобразование десятичного числа в двоичное здесь происходит в cin >> num;. С этого момента число является двоичным, и это подтверждается отсутствием операций деления и остатка с константой 10. То, что вы действительно делаете, — это преобразование из двоичного в зональное двоичное.   -  person user207421    schedule 07.08.2019


Ответы (3)


Вот пример, который собирает биты в Least Significant Bit (LSB):

//...
while (num > 0)
{
  const char bit = '0' + (num & 1);
  biNum += bit;
  num = num >> 1;
}

Объяснение

Цикл продолжается до тех пор, пока переменная num не станет равной нулю. Нет смысла добавлять лишние нули, если вы действительно этого не хотите.

Выражение (num & 1) возвращает 1, если бит равен 1, или 0, если бит равен 0.
Затем это добавляется к символу 0 для получения '0' или '1'.

Переменная объявлена ​​как const, так как она не будет изменена после объявления (определения).

Вновь созданный символ добавляется к битовой строке.

Наконец, num сдвигается вправо на один бит (поскольку этот бит уже был обработан).

Есть много других способов собрать биты в порядке старших значащих битов (MSB). Эти способы оставлены для ОП и читателя. :-)

person Thomas Matthews    schedule 07.08.2019

Ну вот. Это выводит биты в правильном порядке:

#include <iostream>
#include <string>

int main ()
{
    unsigned num;
    std::string biNum;
    std::cin >> num;

    while (num)
    {
        char bit = (num & 1) + '0';
        biNum.insert (biNum.cbegin (), bit);
        num >>= 1;
    }

    std::cout << biNum;
    return 0;
}

Прямая демонстрация

person Paul Sanders    schedule 07.08.2019

Вы можете использовать рекурсивную функцию для печати результата в обратном порядке, избегая использования контейнера/массива, например:

void to_binary(int num) {    
    int rem = num % 2;
    num = (num - rem) / 2;    
    if (num < 2){ 
        std::cout << rem << num;
        return;
    }    
    to_binary(num); 
    std::cout << rem;
}

int main()
{
    to_binary(100);
}
person seccpur    schedule 07.08.2019
comment
Разве это не лишнее здесь? Мы не должны использовать рекурсию, когда ее можно легко написать с помощью итерации. - person BessieTheCookie; 07.08.2019