Покрытие от десятичного до 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. Я просто запутался в его реализации.

0

Решение

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

0

Другие решения

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

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 << " ";
}
}
0

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

0

Прежде всего, ваш алгоритм просто отображает двоичное представление некоторого числа 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

0

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

0