2009-04-20 10 views
5

Czy ktoś może mi wyjaśnić, jak podział w MIX (z TAOCP przez Knuth) działa na zasadzie bajt po bajcie?Jak podział działa w MIX?

rA = |-| . . . .0| 

rX = |+|1235|0|3|1| 

Miejsce w pamięci 1000 zawiera |-|0|0|0|2|0|.

Kiedy wykonać operację

DIV 1000 

rejestry stać

rA = |+|0|617|?|?| 

rX = |-|0|0|0|?|1| 

Teraz rozumiem znaki na rA i rX, ale w jakiej kolejności są bajty rAX wypełniony i które podziały są Gotowe?

Jeśli DIV 1000 prowadzą do każdego bitu podzielony przez 2, a potem by się spodziewać

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

w którym rA zawiera wyniki podział i rX wypełnione resztkami (z prawej strony).

Prawdopodobnie brakuje mi tu czegoś, a Knuth wydaje się sądzić, że powinienem móc sam to rozgryźć (stąd pytania na poziomie 10, które też nie dostaję), ale czy ktoś może mi pomóc? tutaj?

Odpowiedz

3

Więc sam to wymyśliłem.

Jeśli zrobisz podział ręcznie, konwertując bajty na jedną liczbę, otrzymasz -210.501.825 (jeśli używasz najmniejszego rodzaju bajtu - czyli 6 bitów (!) W książce Knuthsa). Podziel to przez -128, co jest wartością w lokalizacji 1000 przy użyciu tego samego bajtu.

Iloraz to 1644545, reszta 65, znak będzie dodatni, ponieważ obie liczby są ujemne. Jeśli przechowujesz 1644545 w RA i 65 w RX, otrzymasz

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

stosując najmniejszą bytesize (który posiada 64 cyfr). Ponieważ Knuth nigdy nie zakłada w swoich przykładach konkretnego bajtu, rX ma wiele znaków zapytania. Znak rX jest zawsze poprzednią oznaką rA.

Edytuj: Użyłem bardzo przydatnego narzędzia MixEmul do zabawy z rejestrami MIX. Jest to całkiem niezła implementacja MIX wykonana w .NET