代码之家  ›  专栏  ›  技术社区  ›  Ruben Steins

部门如何在混合中工作?

  •  5
  • Ruben Steins  · 技术社区  · 15 年前

    有人能给我解释一下混合中的除法(从taocp到knuth)是如何在字节对字节的基础上工作的吗?

    rA = |-| . . . .0| 
    
    rX = |+|1235|0|3|1|
    

    内存位置1000包含 |-|0|0|0|2|0| .

    执行操作时

    DIV 1000
    

    寄存器变成

    rA = |+|0|617|?|?|
    
    rX = |-|0|0|0|?|1|
    

    现在我明白了 rA rX ,但字节的顺序是 rAX 填写了哪些分区?

    如果DIV1000导致每一位除以2,那么我希望

    rAX = |+|617|0|1|0|-|0|1|0|1|1| 
    

    在哪儿 包含划分结果和 RX 剩余部分(从右侧填充)。

    我可能在这里遗漏了一些东西,而Knuth似乎认为我应该能够自己弄清楚(因此我也没有得到关于它的第10级问题),但是有人能帮我解决这个问题吗?

    1 回复  |  直到 15 年前
        1
  •  3
  •   Ruben Steins    15 年前

    所以我自己想出来了。

    如果您手工进行除法,通过将字节转换为单个数字,您将得到-210501825(如果您使用的是最小类型的字节-即6位!!)在克努斯的书中)。将其除以-128,即位置1000中使用相同字节大小的值。

    商是1644545,余数是65,符号是postive,因为这两个数字都是负数。如果您在RA中存储1644545,在RX中存储65,您将获得

    |+|0|6|17|32|01|
    |-|0|0|0|1|1|
    

    使用最小的字节大小(可容纳64个数字)。由于Knuth在他的例子中从来没有假设过特定的字节化,Rx有许多问号。Rx符号始终是RA的前一个符号。

    编辑:我用的非常方便 MixEmul 利用混合寄存器进行游戏。这是在.NET中完成的非常好的混合实现

    推荐文章