primo luogo, trovare la rappresentazione di 1/9 in binario 0,0001110001110001
significa che è (1/16) + (1/32) + (1/64) + (1/1024) + (1/2048) + (1/4096) + (1/65536)
so (x/9) uguale a (x >> 4) + (x >> 5) + (x >> 6) + (x >> 10) + (x >> 11) + (x >> 12) + (x >> 16)
Possibile ottimizzazione (se i cicli sono consentiti):
se un ciclo su diritto 0001110001110001b spostandolo ogni ciclo,
add "x" per il risultato registrarsi ogni volta che il bagaglio è stato impostato su questo spostare e spostare il risultato giusto ogni volta successivo, il risultato è x/9
mov cx, 16 ; assuming 16 bit registers
mov bx, 7281 ; bit mask of 2^16 * (1/9)
mov ax, 8166 ; sample value, (1/9 of it is 907)
mov dx, 0 ; dx holds the result
div9:
inc ax ; or "add ax,1" if inc's not allowed :)
; workaround for the fact that 7/64
; are a bit less than 1/9
shr bx,1
jnc no_add
add dx,ax
no_add:
shr dx,1
dec cx
jnz div9
(attualmente non si può verificare ciò, può essere sbagliato)
Può 'n' essere negativo? In tal caso, il giusto spostamento è uno spostamento aritmetico o uno spostamento logico? –
[Dividi per 10 utilizzando i bit shift?] (Http://stackoverflow.com/q/5558492/995714), [Dividi un numero per 3 senza utilizzare *, /, +, -,% operatori] (http: // stackoverflow.com/q/11694546/995714), [Come posso moltiplicare e dividere usando solo il bit shifting e l'aggiunta?] (http://stackoverflow.com/q/2776211/995714), [Implementare la divisione con l'operatore bit-wise ] (http://stackoverflow.com/q/5284898/995714) –
da dividere per 9, [moltiplicare per 954437177] (http://www.hackersdelight.org/magic.htm) –