将BCD转换为二进制的最有效方法

And*_*ndy 5 c# binary bcd

我有下面的代码将32位BCD值(以两个uint half提供)转换为uint二进制值.

提供的值最大为0x9999,最大值为0x99999999.

是否有更好(即更快)的方法来实现这一目标?

    /// <summary>
    /// Convert two PLC words in BCD format (forming 8 digit number) into single binary integer.
    /// e.g. If Lower = 0x5678 and Upper = 0x1234, then Return is 12345678 decimal, or 0xbc614e.
    /// </summary>
    /// <param name="lower">Least significant 16 bits.</param>
    /// <param name="upper">Most significant 16 bits.</param>
    /// <returns>32 bit unsigned integer.</returns>
    /// <remarks>If the parameters supplied are invalid, returns zero.</remarks>
    private static uint BCD2ToBin(uint lower, uint upper)
    {
        uint binVal = 0;

        if ((lower | upper) != 0)
        {
            int shift = 0;
            uint multiplier = 1;
            uint bcdVal = (upper << 16) | lower;

            for (int i = 0; i < 8; i++)
            {
                uint digit = (bcdVal >> shift) & 0xf;

                if (digit > 9)
                {
                    binVal = 0;
                    break;
                }
                else
                {
                    binVal += digit * multiplier;
                    shift += 4;
                    multiplier *= 10;
                }
            }
        }

        return binVal;
    }
Run Code Online (Sandbox Code Playgroud)

Pet*_*ham 8

如果你有足够的空间来容纳39,322元素阵列,你可以随时查看值.


epo*_*ter 6

如果您展开循环,请记住保持位移.

value =  ( lo        & 0xF);
value += ((lo >> 4 ) & 0xF) * 10;
value += ((lo >> 8 ) & 0xF) * 100;
value += ((lo >> 12) & 0xF) * 1000;
value += ( hi        & 0xF) * 10000;
value += ((hi >> 4 ) & 0xF) * 100000;
value += ((hi >> 8 ) & 0xF) * 1000000;
value += ((hi >> 12) & 0xF) * 10000000;
Run Code Online (Sandbox Code Playgroud)


Kon*_*lph 3

你的代码看起来相当复杂;您需要具体的错误检查吗?

否则,您可以只使用下面的代码,它不会慢,事实上,它基本上是相同的:

uint result = 0;
uint multiplier = 1;
uint value = lo | hi << 0x10;

while (value > 0) {
    uint digit = value & 0xF;
    value >>= 4;
    result += multiplier * digit;
    multiplier *= 10;
}
return result;
Run Code Online (Sandbox Code Playgroud)