【问题标题】:DCPU-16 DIV instructionDCPU-16 DIV 指令
【发布时间】:2012-04-11 19:32:39
【问题描述】:

我正在查看 DCPU-16 的 specification,但我无法理解 DIV 指令溢出值的用途:

DIV a, b - 将 a 设置为 a/b,将 O 设置为 ((a

谁能在这里解释一下O的语义,它有什么用处?

【问题讨论】:

  • 我认为它比无用更糟糕,'O' 需要 32/16 位除法!将“O”设置为余数会更有用,并使多精度算术更容易。

标签: assembly dcpu-16


【解决方案1】:

看起来 O 给出了结果的小数部分(作为定点数)。例如,考虑 5 / 2:

a = 5 / 2 = 2 (integer part)
O = ((5 << 16) / 2) & 0xffff = (327680 / 2) & 0xffff = 32768

如果您将 O 视为 16 位二进制小数,则这表示结果的 0.5 小数部分。

另一种看待它的方式是以位为单位的二进制结果是:

aaaaaaaaaaaaaaaa.OOOOOOOOOOOOOOOO

5 / 2 是

0000000000000010.1000000000000000

您可以通过检查得知,该结果是 5(101 二进制)右移一位进入小数位。

【讨论】:

    【解决方案2】:

    ((a&lt;&lt;16)/b) 将为您提供除法的 16 位小数部分。

    以 10 为底更容易看出:如果我们想找到 5/3 的前三个小数位,我们可以将 5 移动三个位置 (5000),然后除以 3,然后取最后三位整数。 5000/3 是 1666,所以 5/3 小数点后的前三位是 0.666。


    之所以有效,是因为“将 5 移动一位数”与“乘以 10”相同,并且乘法/除法是可交换的(顺序可以交换),所以 (5 * 1000) / 3 = (5 / 3) * 1000 = 1.6666... * 1000 = 1666.666....

    换句话说,将 5 移动几位并除以 3 与将 (5/3) 移动几位相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-20
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多