Mam poniższy kod do konwersji 32-bitowej wartości BCD (dostarczanej w dwóch uintach) do binarnej wartości uint.Najbardziej efektywny sposób konwersji BCD na binarny
Podane wartości mogą mieć wartość do 0x9999, tworząc maksymalną wartość 0x99999999.
Czy istnieje lepszy (tj. Szybszy) sposób, aby to osiągnąć?
/// <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;
}
Wygląda cholernie dobry dla mnie. – Spence
Dlaczego wymaga to dwóch uintów zamiast ushorts, jeśli każdy reprezentuje tylko 16 bitów? –