例如,十进制数字395的BCD码是001110010101,直接二进制转换是110001011, 哪一台价值计算机可用于算术运算
答案 0 :(得分:1)
大多数CPU仅对二进制数字提供有效的硬件支持(并且通常仅对现代CPU中2的幂数大小,因此您希望将其填充到至少16位)。 / p>
不过,您可以使用移位/掩码和比较操作来检查打包成的BCD(每个半字节1位),并检查数字是否变为>9
,然后手动将进位传播到下一个位(此字节的高半字节,或到下一个字节)。即作为加/减的一部分,类似于带进位的扩展精度二进制加/减。
某些CPU甚至有一个标志,用于从低四位进位。例如x86的AF。在16位和32位模式下,x86甚至具有(慢)指令来在对包含两个压缩的BCD数字的字节进行常规二进制加法运算后调整结果。 ({DAA / DAS,以及其他有关未打包BCD(每字节1位数字)的指令,所有指令都在64位模式下删除,并且在当前CPU上以16位和32位模式进行微码处理的速度很慢。)
其他一些ISA在协助打包BCD的计算方面也具有类似的支持,例如半进位标志。
解压缩的BCD(每字节1位数字)更易于实现,因为您可以比较>9
的整个字节而无需先提取低4位来生成下一位数字的进位信号。 (无需解压缩就可以检查>= (10<<4)
的高4位。)
但是,任何具有AND / OR和右移/左移指令的常规体系结构都非常容易提取半字节并手动进行>9
并完全调整+进位检查。正在执行多项操作,最好暂时将其解压缩为字节,最后再重新打包,甚至转换为二进制。
但是从二进制转换回BCD的代价很高:您必须将结果的每个非零数字除以10,一次生成一个数字。这需要乘法和移位,这在低端CPU上很慢。 Why does GCC use multiplication by a strange number in implementing integer division?。如果您有更多的二进制位可以馈入单个乘法或除法,那么在数字变得足够小之前,每位数字的成本就会大大增加。