MIX 中的除法是如何进行的?
有人可以向我解释一下 MIX 中的除法(来自 Knuth 的 TAOCP)是如何在字节到字节的基础上工作的吗?
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 的字节按什么顺序填充和做了哪些部门?
如果 DIV 1000 导致每个位除以 2,那么我期望
rAX = |+|617|0|1|0|-|0|1|0|1|1|
其中 rA
包含除法结果,而 rX
包含余数(从右侧填充)。
我可能在这里遗漏了一些东西,Knuth 似乎认为我应该能够自己弄清楚(因此有关于它的 10 级问题,我也没有得到),但是有人可以在这里帮助我吗?
Can someone explain to me how division in MIX (from TAOCP by Knuth) works on a byte-to-byte basis?
rA = |-| . . . .0|
rX = |+|1235|0|3|1|
The memory location 1000 contains |-|0|0|0|2|0|
.
When you execute the operation
DIV 1000
the registers become
rA = |+|0|617|?|?|
rX = |-|0|0|0|?|1|
Now I understand the signs on rA
and rX
, but in what order are the bytes of rAX
filled and which divisions are done?
If DIV 1000 leads to every bit divided by 2, then I would expect
rAX = |+|617|0|1|0|-|0|1|0|1|1|
in which rA
contains the division results and rX
the remainders (filled from the right side).
I'm probaly missing something here, and Knuth seems to think I should be able to figure it out myself (hence the level 10 questions about it, which I also don't get), but could someone help me out here?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
所以我自己想出了办法。
如果您手动进行除法,通过将字节转换为单个数字,您将得到 -210,501,825(如果您使用的是最小类型的字节 - 在 Knuth 的书中为 6 位(!))。 将此值除以 -128,即使用相同字节大小的位置 1000 中的值。
商为 1644545,余数为 65,由于两个数均为负数,因此符号为正数。 如果您在 rA 中存储 1644545,在 rX 中存储 65,您将
使用最小的字节大小(可容纳 64 个数字)。 由于 Knuth 在他的示例中从未假设特定的字节大小,因此 rX 有许多问号。 rX 的符号始终是 rA 的前一个符号。
编辑:我使用了非常方便的 MixEmul 实用程序来使用 MIX 的寄存器。 这是在 .NET 中完成的一个非常好的 MIX 实现
So I kind of figured it out myself.
If you do the division by hand, by converting the bytes into a single number you will get -210,501,825 (if you're using the smallest kind of byte - which is 6 bits (!) in Knuths book). Divide this by -128, which is the value in location 1000 using the same bytesize.
The quotient is 1644545, the remainder 65, the sign will be postive since both numbers are negative. If you store 1644545 in rA and 65 in rX, you will get
using the smallest bytesize (which holds 64 numbers). Since Knuth never assumes a particular bytesize in his examples, rX has a number of question marks. The sign of rX is always the previous sign of rA.
Edit: I used the very handy MixEmul utilty to play around with the registers of MIX. This is a pretty nice MIX implementation done in .NET