 |
LjL |
.consigliere.
Registered: Dec 2003
Posts: 144 (0.02 al dì)
Location: Milano
Corso: Informatica
Anno: Primo
Time Online: 16:25:17 [...]
Status: Offline
Edit | Report | IP: Logged |
Bel macello.
La prima cosa che mi viene in mente è questa: se tu hai, per dire, 32 bit, shiftare di uno a destra è equivalente a ruotare di 31 volte a sinistra.
[Ruotare è la stessa cosa di shiftare, con l'aggiunta che, quando ruoti, la cifra che "esce" dall'MSB del numero (il carry out se così vuoi chiamarlo) deve andare a finire nell'LSB del risultato; quindi, se hai 4 bit e vuoi routare il numero 1010 di uno a sinistra, il risultato è 0101, e non 0100 come nel caso dello shift.]
Ora... tu *puoi* shiftare a sinistra; se hai anche un'istruzione per chiedere al processore "c'è o non c'è carry out?", puoi sommare 1 al risultato nel caso in cui il carry out ci sia, e hai la tua rotazione a sinistra.
A questo punto ti "basta" ripetere l'operazione 31 volte. Gran metodo eh...? E tra l'altro non mi ricordo se esiste un'istruzione IJVM che permette di effettuare un salto a seconda del carry out.
Il problema a trovare un algoritmo decente è che, mentre su Internet trovi tutti gli algoritmi che vuoi per la generica divisione intera x/y, fai fatica a trovarne per la divisione per 2, dato che chiunque suppone che tu possa shiftare in quel caso... (e tra l'altro il MIC-1 ha un registro di shift, a cosa diavolo serviva?)
Pubblicità: se vuoi dài un'occhiata a http://www.sf.net/projects/micsimkit , è un simulatore MIC-1, microassembler e macroassembler IJVM adattabile che ho scritto due anni fa. Pieno di bug, ma se c'è qualcuno tipo te a cui magari interessa potrei rimettermi lì...
__________________
by LjL
ljlbox@tiscali.it
http://ljl.150m.com - appunti corsi
|