Conver BCD字符串为十进制

时间:2016-02-29 20:16:08

标签: c++ c++11

我正在寻找更好的方法来优化此功能以获得更好的性能,加速其针对嵌入式设备的目标。我欢迎任何指示,建议谢谢

函数将字符串BCD转换为十进制

int ConvertBCDToDecimal(const std::string& str, int splitLength)
{
    int NumSubstrings = str.length() / splitLength;
    std::vector<std::string> ret;
    int newvalue;

    for (auto i = 0; i < NumSubstrings; i++)
    {
        ret.push_back(str.substr(i * splitLength, splitLength));
    }

    // If there are leftover characters, create a shorter item at the end.
    if (str.length() % splitLength != 0)
    {
        ret.push_back(str.substr(splitLength * NumSubstrings));
    }

    string temp;

    for (int i=0; i<(int)ret.size(); i++)
     {
         temp +=ReverseBCDFormat(ret[i]);
     }

    return newvalue =std::stoi(temp);

}

string ReverseBCDFormat(string num)
{

    if( num == "0000")
    {
        return "0";
    }
    else if( num == "0001")
    {
        return "1";
    }
    else if( num == "0010")
    {
        return "2";
    }
    else if( num == "0011")
    {
        return "3";
    }
    else if( num == "0100")
    {
        return "4";
    }
    else if( num == "0101")
    {
        return "5";
    }
    else if( num == "0110")
    {
        return "6";
    }
    else if( num == "0111")
    {
        return "7";
    }
    else if( num == "1000")
    {
        return "8";
    }
    else if( num == "1001")
    {
        return "9";
    }
    else
    {
        return "0";

    }

}

更新 这是我打算得到的,对于BCD值:: 0010000000000000十进制结果2000

3 个答案:

答案 0 :(得分:1)

BCD是一种编码十进制数的方法,两个到一个字节。

例如,0x12345678是十进制数12345678的BCD表示。但是,这似乎并不是您正在处理的内容。所以,当你说BCD时,我不确定你是说BCD。

至于代码,你可以通过迭代每个子字符串并直接计算值来加快它的速度。至少,更改ReverseBCDFormat以返回整数而不是字符串并动态计算字符串:

temp = temp * 10 + ReverseBCDFormat(...)

类似的东西。

答案 1 :(得分:0)

你所谓的BCD实际上并不是BCD。

如果不这样做,你可以这样做:

int ConvertBCDToDecimal(const std::string& str, int splitLength)
{
    int ret = 0;
    for (unsigned i = 0, n = unsigned(str.size()); i < n; )
    {
        int v = 0;
        for (unsigned j = 0; j < splitLength && i < n; ++j, ++i)
            v = 2*v + ('1' == str[i] ? 1 : 0); // or 2*v + (str[i]-'0')
        ret = 10*ret + v;
    }
    return ret;
}

摆脱所有无用的 vector 制作和字符串复制。你不需要任何这些。

此外,我认为您的代码在处理长度不是splitLength的倍数的字符串时会出错。我认为你的代码总是认为它们是零。事实上,现在我考虑一下,你的代码不会使用除{4>以外的任何splitLength

顺便说一句,如果您提供一些示例输入及其预期输出,我将能够实际验证我的代码与您的相比(假设您的BCD定义与大多数人不同,您的代码所做的并不完全清楚。)

答案 2 :(得分:0)

一旦您进行了优化功能,这里有不同的变体:

int ConvertBCDToDecimal(const std::string& str) {
    unsigned int result = 0;
    const std::string::size_type l = str.length();
    for (std::string::size_type i = 0; i < l; i += 4)
        result = result * 10 + ((str[i] - '0') << 3) + ((str[i + 1] - '0') << 2) + ((str[i + 2] - '0') << 1) + (str[i + 3] - '0');
    return result;
}

注意:您不需要splitLength参数,因为您知道每个数字都是4个符号