将BCD转换为二进制的最有效方法
我有下面的代码将32位BCD值(以两个uint half提供)转换为uint二进制值。
提供的值最大为0x9999,最大值为0x99999999。
是否有更好(即更快)的方法来实现这一目标?
/// /// Convert two PLC words in BCD format (forming 8 digit number) into single binary integer. /// eg If Lower = 0x5678 and Upper = 0x1234, then Return is 12345678 decimal, or 0xbc614e. /// /// Least significant 16 bits. /// Most significant 16 bits. /// 32 bit unsigned integer. /// If the parameters supplied are invalid, returns zero. 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 > shift) & 0xf; if (digit > 9) { binVal = 0; break; } else { binVal += digit * multiplier; shift += 4; multiplier *= 10; } } } return binVal; }
如果你有足够的空间来容纳39,322元素arrays,你可以随时查看值。
如果您展开循环,请记住保持位移。
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;
你的代码看起来相当复杂; 你需要特定的错误检查吗?
否则,你可以使用下面不应该慢的代码,事实上,它大致相同:
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;
试试这个:
public static int bcd2int(int bcd) { return int.Parse(bcd.ToString("X")); }
我想你可以展开循环:
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;
你可以检查无效的BCD数字,如下所示:
invalid = lo & ((lo&0x8888)>>2)*3
如果任何单个hex数字> 9,则将无效值设置为非零值。
当然,有一种更有效的方法。 这只是一个例子当然,所以你可以把它作为一个教训^^
function bcd_to_bin ($bcd) { $mask_sbb = 0x33333333; $mask_msb = 0x88888888; $mask_opp = 0xF; for($i=28;$i;--$i) { $mask_msb <<= 1; $mask_opp <<= 1; $mask_sbb <<= 1; for($j=0;$j<$i;$j+=4) { $mask_opp_j = $mask_opp << $j; if ($bcd & $mask_msb & $mask_opp_j ) { $bcd -= $mask_sbb & $mask_opp_j; } } } return $bcd;
}
上述就是C#学习教程:将BCD转换为二进制的最有效方法分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---计算机技术网(www.ctvol.com)!
public static uint BCDToNum(int num) { return uint.Parse(num.ToString(), System.Globalization.NumberStyles.HexNumber); }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/983573.html