这是一个关于将范围从0到 99,999的十进制数转化为二进制BCD格式的C/C++程序。该程序利用一种简单的算法并配合指针运算以及逐位移位方法来提高转换速度,而无需过多的内存消耗及复杂的程序。

当十进制数在0到9范围时,它们的二进制数和BCD的表达形式均为4位(0000 到1001)。当十进制数在10到19范围时,相应的二进制由4位变为5位,即从1010到10011;而BCD格式则使用8位,即从0001 0000 到 0001 1001。如果将BCD当作标准的二进制数,并将它与十进制数值所对应的二进制数相比较,我们将注意到二者之间的差别为十进制数字6。当十进制数在10到19之间变化时,BCD的十进制数值则在16到25之间变化。增加实际十进制数范围为20到29时,则二者之差为12。

这个过程持续到99,两者的差值等于一个有意义的十进制数字与6的乘积。因此,十进制数90是用90+9×6 =144表示成BCD格式。当十进制数范围为100到109时,用实际十进制数+156 (26×6)表示成BCD格式。当范围为110到119时,则用实际十进制数+156+6来表示BCD。

如果对从0到99,999范围内的十进制持续这个过程,BCD的十进制数则可以用算法定义成下面的公式:dbcd = (m×9256 + I×516 + b×26 + cc) ×6 + x在公式中,x为实际的十进制数值;cc等于x对100取模后再除以10的结果的整数部分;b等于x对1000取模后再除以100的结果的整数部分;I等于x对10000取模后再除以1000的结果的整数部分;m等于x除以10000的结果的整数部分。

本程序使用两个一维数组存储二进制数(c[18])及BCD数(bcd[20]),因为它们是在各自的转换函数内按位循环移动而产生的。依靠向右的位移来完成实际位在数组中恰当位置的赋值,通过数组索引,十进制数得以转换。然后替换的数字被作上标记或者与I的十六进制数作“与”运算。每一组的这些位通过相关指针添加到数组中。二进制转换函数的索引下标为0到18,而BCD转换函数使用的索引下标为0到20。十进制数0 到99,999这一范围决定了这些索引。

本程序也包含一个称为LOCATE的函数,它能使光标定位于显示器可视屏幕中任意指定的行或列。程序其余部分具有各种打印状态,以便设置二进制、BCD、十进制以及BCD到十进制数的格式,并排列成整齐的表格形式。

对于大部分计算机,实际的十进制数组很轻易就会超过无符号长整型数的上限值232。当十进制数超过99,999时,dbcd公式就需要作恰当修改以适应附加数值的边界变化。

Advertisements