将十进制数转换为PackedBCD和Versa

时间:2016-02-26 16:42:31

标签: c++

我想修改此函数以返回4位packedBCD而不是解压缩任何指针的人。谢谢。

string dfc = ConvertDecimalToBCD((int)decimalNumber);
cout<<"BDCValue::"<<dfc<<endl;
cout<<endl;

对于十进制数2000,我想获得0010 0000而不是0010 0000 0000 0000。如果可能的话

    string ConvertDecimalToBCD(int decimal)
    {
        int i = decimal;
        string s, temp, final;
        stringstream out;
        out << i;
        s = out.str();

        for (int i = 0; i < s.size(); i++)
        {
            temp = ReturnBCDFormat(s[i]);
            final = final+temp;
        }

        return final;
    }

返回bcd格式的函数。

string ReturnBCDFormat(char num)
{
    switch (num)
    {
    case '0':
        return "0000";
        break;
    case '1':
        return "0001";
        break;
    case '2':
        return "0010";
        break;
    case '3':
        return "0011";
        break;
    case '4':
        return "0100";
        break;
    case '5':
        return "0101";
        break;
    case '6':
        return "0110";
        break;
    case '7':
        return "0111";
        break;
    case '8':
        return "1000";
        break;
    case '9':
        return "1001";
        break;
    default:
        return "2";
        break;
    }
}

2 个答案:

答案 0 :(得分:0)

如果您将ReturnBCDFormat更改为接受整数0-9而不是字符&#39; 0&#39; - &#39; 9&#39;,或者您更改以下代码以添加&#39; 0& #39;对于传递给ReturnBCDFormat的参数,这应该有效:

string ConvertDecimalToBCD(int decimal)
{
    if(decimal == 0)
       return "0";
    else
    {
      string result;
      while(decimal > 0)
      {
        result = ReturnBCDFormat(decimal % 10) + result;
        decimal /= 10;
      }
      return result;
    }
}

如果性能在这方面至关重要,你可以将一对数字打包成一个无符号字符,可能使用一个向量来保存它,但上面的代码仍应比字符串流解决方案更快。

答案 1 :(得分:0)

首先转换为BCD二进制编码,然后打印为十六进制。

    int raw = 7947;
    int encoded = 0;
    int i = 0; 

    while ( raw != 0 )
    {
        int tenth = raw % 10;
        encoded |= tenth << (i * 4);
        raw /= 10;
        ++i;
    }

    cout << hex << encoded << std::endl;

或直接生成字符串

    int raw = 7947;
    string encoded;


    do {
        int tenth = raw % 10;
        encoded.insert( 0, 1, '0' + tenth ); // depends on ASCII digit 
        raw /= 10;
    }
    while ( raw > 0 );

    cout << encoded << std::endl;

除非这不能给出你想要的二进制表示。但是提到这个问题How to print (using cout) the way a number is stored in memory?会产生

std::bitset< sizeof( int ) > binary( encoded );
cout << binary << std::endl;