// 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. Я просто запутался в его реализации.
Разве вы не можете просто заменить% 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 для каждой целой цифры и объединить строки двоичных цифр, чтобы получить полный результат.
Прежде всего, ваш алгоритм просто отображает двоичное представление некоторого числа 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.