Покрытие от десятичного до BCD

// C++ program to convert a decimal
// number to binary number

#include <iostream>
using namespace std;

// function to convert decimal to binary
void decToBinary(int n)
{
    // array to store binary number
    int binaryNum[1000];

    // counter for binary array
    int i = 0;
    while (n > 0) {

        // storing remainder in binary array
        binaryNum[i] = n % 2;
        n = n / 2;
        i++;
    }

    // printing binary array in reverse order
    for (int j = i - 1; j >= 0; j--)
        cout << binaryNum[j];
}

// Driver program to test above function
int main()
{
    int n = 17;
    decToBinary(n);
    return 0;
}

Так что это программа для преобразования десятичных чисел в двоичные. Теперь я пытаюсь преобразовать десятичные числа в BCD. Я понимаю, что если у меня есть число, например, 215, я разделяю каждое число [2,1,5], а затем преобразую каждое число в двоичное, чтобы оно составляло 0010,0001,0101. Я просто запутался в его реализации.

5 ответов

Прежде всего, ваш алгоритм просто отображает двоичное представление некоторого числа nвместо того, чтобы делить его на однозначные числа и возвращать некоторый набор их двоичного представления.

Чтобы облегчить жизнь, мы будем использовать стандартные контейнеры и стандартные алгоритмы:

[...] если у меня есть число, например 215, я разделяю каждое число [2,1,5], а затем преобразую каждое число в двоичное, чтобы оно составляло 0010,0001,0101

Отлично, это означает, что нам нужен какой-то контейнер для хранения этих трех представлений, не так ли? Мой выбор будет std::vectorВедь это невероятно просто и эффективно! Вы можете прочитать больше об этом здесь.

Упомянутый vector в конечном итоге будет хранить двоичные представления, но здесь мы сталкиваемся с другой проблемой - нам действительно нужно как-то их представлять!

К счастью, стандарт дает нам отличный инструмент - std::bitset, что объясняется здесь. Он в основном используется для облегчения бинарных операций, но одна из его замечательных особенностей заключается в том, что он также чрезвычайно хорош, будучи просто двоичным представлением.

Последняя функция может выглядеть так:

auto dec_to_bin(int n)
{
    std::vector<std::bitset<4>> repr;
    while(n > 0){
        repr.push_back(std::bitset<4>(n % 10));
        n /= 10;
    }
    std::reverse(repr.begin(), repr.end());
    return repr;
}

Что здесь происходит?

Сначала мы создаем vector наборов битов фиксированного размера (размером 4, поскольку каждая десятичная цифра может быть представлена ​​в виде четырех двоичных цифр), то до тех пор, пока n больше нуля (вы уже знаете, почему - вы используете ту же логику в своем коде), мы добавляем (используя push_back) новый набор битов, который будет обрабатываться как двоичное представление по модулю вашего номера (т.е. последняя цифра).

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

Наконец, мы можем использовать нашу функцию в main в качестве таких:

int main()
{
    for(auto b : dec_to_bin(215)){
        std::cout << b << ' ';
    }
}

Это напечатает 0010 0001 0101, который был желаемым выходом для числа 215

Размещенный вами исходный код не конвертируется в BCD. Он отображает двоичное представление чисел в виде нулей и единиц. Таким образом, 215 будет отображаться как 11010111, а 17 будет отображаться как 10001.

Разве вы не можете просто заменить% 2 и / 2 на% 10 и / 10? Переменные будут названы неправильно, но это алгоритмическое изменение.

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

void decToBCD(int n) {
    // array to store digits
    int digits[10];

    // counter for digits
    int i = 0;
    while (n > 0) {
        // storing remainder in digit array
        digits[i] = n % 10;
        n = n / 10;
        i++;
    }

    // printing binary representation of digits
    for (int j = i - 1; j >= 0; j--) {
        decToBinary(digits[j]);
        cout << " ";
    }
}

Я хотел бы обновить то, что вы должны вернуть строку из decToBinary вместо печати в cout, затем вы можете написать decToBCD, который использует модуль 10 для определения целого числа для каждой цифры числа (так же, как вы использовали модуль 2 и деление на 2, чтобы получить каждый бит в decToBinary), и вызвать decToBinary для каждой целой цифры и объединить строки двоичных цифр, чтобы получить полный результат.

Другие вопросы по тегам