divide by 10000 result is 1 remainder 2345 save or print the 1
divide by 1000 result is 2 remainder 345 save or print the 2
divide by 100 result is 3 remainder 45 save or print the 3
divide by 10 result is 4 remainder 5 save or print the 4 and 5
第二种方式
divide by 10 result is 1234 remainder 5 save the remainder use the result
divide by 10 result is 123 remainder 4 save the remainder use the result
divide by 10 result is 12 remainder 3 save the remainder use the result
divide by 10 result is 1 remainder 2 save both the remainder and result
print the results in the right order
2条答案
按热度按时间vxf3dgd41#
无论你使用什么语言,转换成十进制打印是相同的过程。嗯,两个过程之一。你可以从任何一端开始。假设你有一个16位数字12345(0x 3039)。
第一种方法是
第二种方式
现在,如果你的问题是如何用我的指令集将一个64位数除以10的幂,那么有时候你可以,有时候你不能,有时候你必须使用其他的数学规则。除以10和除以2*5是一样的,所以你可以除以2(移位),然后除以5。
0x 3039位(12345)除以10000等于右移4,然后除以5的4次方(625)。0x 303 = 771,771/625 = 1。如果除法不是那么大,乘法也可能不是,因此1 * 625 = 0x 271,0x 271〈〈4 = 0x 2710,0x 3039 - 0x 2710 = 0x 929 = 2345。一旦你得到了一个数字,你可以用硬件相除,然后使用硬件。
你可能需要除以中间的一个数字,比如说你有一个32位的数字(最大值为4,294,967,296),并且您的硬件可以将一个32位数除为16位结果和16位余数。您可以使用上述方法减去几位数,比如留下94,967,295然后除以10000得到9496余数7295然后使用硬件独立地处理这些四位数。
如果你没有除法硬件,但乘法硬件(是的,我知道你指定8086),你可以这样做:
http://www.divms.uiowa.edu/~jones/bcd/divide.html
如果你还记得小学时如何在纸上做乘法:
二进制使得这一点非常简单,正如你从我选择的数字中所想象的那样
如果要将四位abcd乘以四位efgh,则:
对于大多数指令集,您可以将此乘法级联到与您的内存一样宽的宽度,希望将1百万位乘以1百万位。没有问题,500,000字节加上多一点或几个寄存器(以及大量时钟周期)。
dohp0rv52#
我做的和old_timer说的差不多,但是更优化了一点。如果输入是65535,这将发生:
它的优化程度更高,因为您只需要执行两次16位除法,并且只需要使用3个16位寄存器几次
下面是代码:
This视频确实帮助我了解了如何以及为什么