从十进制到BCD的转换

时间:2018-01-16 22:51:56

标签: c++ binary 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。我只是对实现它感到困惑。

4 个答案:

答案 0 :(得分:0)

你不能用%10和/ 10替换%2和/ 2吗?变量将被命名为错误,但这是算法的变化。

答案 1 :(得分: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 << " ";
    }
}

答案 2 :(得分:0)

我会更新你必须从decToBinary返回一个字符串而不是打印到cout,你可以编写decToBCD,它使用模10来计算数字的每个数字的整数(就像你使用modulo 2一样)然后除以2得到decToBinary中的每个位,并为每个整数位调用decToBinary并连接二进制数字的字符串以得到完整的结果。

答案 3 :(得分:0)

首先,您的算法只显示某个数字n的二进制表示,而不是将其分成单个数字并返回一些二进制表示。

为了让生活更轻松,我们将使用标准容器和标准算法:

  

[...]如果我有一个像215这样的数字,我将每个数字[2,1,5]分开然后将每个数字转换为二进制数,这样它就会是0010,0001,0101

很好,这意味着我们需要某种容器来保存这三个表示,不是吗?我的选择是std::vector,因为它非常简单而有效!您可以阅读更多相关信息here

提到的vector最终将存储二进制表示,但在这里我们遇到另一个问题 - 我们实际上需要以某种方式表示它们!

幸运的是,该标准为我们提供了一个很棒的工具 - std::bitset,其解释为here。它主要用于使二进制操作更容易,但它的一个很棒的特性就是它非常擅长于二进制表示。

最终功能可能如下所示:

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)一个新的bitset,它将被视为你的数字的模数的二进制表示(即最后一位数。)

请记住,通过这样做,我们以相反的顺序创建了vector。我们要做的最后两件事只是reverse并将其返回!

最后,我们可以在main中使用我们的函数:

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

这将打印0010 0001 0101,这是数字215

所需的输出