Questo codice ha un argomento (ovviamente passato sullo Stack)
e una variabile locale (count). Questo significa che i 4 byte che precedono
questo codice quando inserito nella Method Area sono 0x00 0x02 0x00 0x01
BIPUSH 0 // out:= 1
BIPUSH 1 // count := 1
ISTORE 2
Loop:ILOAD 2 // if count == 0 goto End
IFEQ End
DUP // Lshift out
IADD
ILOAD 1 // if argomento < 0 goto E1
IFLT E1
BIPUSH 1 // out := out +1
IADD
E1 :ILOAD 1 // Lshift argomento
DUP
IADD
ISTORE 1
ILOAD 2 // Lshift count
DUP
IADD
ISTORE 2
GOTO Loop
End :IRETURN
Soluzione by Andrea Cannella: basta considerare come, presa la rappresentazione di un numero in complemento a due, si ottiene la rappresentazione della sua negazione. Una soluzione all'esercizio puo' quindi essere anche: .method a (n) BIPUSH -1 ILOAD n ISUB IRETURN .end-method
Esercizio 5
Scrivere un segmento di codice IJVM che realizzi un metodo che prende un numero
in input e restituisce il numero la cui rappresentazione e' il NOT logico bit a
bit della rappresentazione del numero in input. Esempio:
Rappresentazione dell'argomento del metodo: 0100110100111110Rappresentazione del risultato : 1011001011000001
Aiutino: i numeri sono rappresentati in complemento a due. Inoltre sommare un numero rappresentato in binario a se stesso equivale ad uno spostamento a sinistra dei suoi bit.
Partiamo da una semplice osservazione matematica:
per esempio il numero
|
Numero in base 10 |
Numero in base 2 |
|
+39 |
00100111 |
|
-40 |
11011000 |
Posto quindi A=39 => NOT A=-40
E’ facile verificare che vale la seguente:
posto A un qualsiasi numero e A’ la sua rappresentazione binaria (nota bene l’esercizio parla espressamente di numeri e loro rappresentazione binaria..) č facile verificare quanto segue: NOT A’ =rappresentazione binaria di A-A-A-1 facilmente ottenibilecon il seguente codice IJVM:
|
LOAD a DUP DUP BIPUSH 1 ADD ADD SUB STORE b |
|
||||||||||||||||
|
Esempio
di cosa accade nello stack |
BIPUSH 1 IADD BIPUSH 0 SWAP ISUB IRETURN
IL NOT BIT A BIT DI UN NUMERO IN COMPLEMENTO A DUE (By Sergio Alestra)
--------------------------------------------------
Se abbiamo un numero in binario per trasformarlo in complemento a 2
basta cambiare tutti gli uno con zero, e viceversa..e infine sommare 1
es:
il numero 9 in binario č:
9 = 0000 1001
se vogliamo il numero -9 in complemento a 2 dovremo
-9=
cambiare gli uno con zero, e viceversa:
1111 0110
e infine sommare 1:
1111 0110 +
1 =
_____________
1111 0111
quindi:
-9 = 1111 0111
In conclusione se vogliamo il NOT logico bit a bit della rappresentazione
del numero in input, dovremo considerare il suo negativo in complemento a 2
e poi sottrarre a questo 1;
infatti per avere il NOT bit a bit di 9
9 = 0000 1001
dovremo considerare -9:
-9 = 1111 0111
e a questo sottrarre 1:
1111 0111 -
1 =
_____________
1111 0110
che altro non č il suo NOT bit a bit.
ecco il metodo:
.method NOTbitAbit(x)
BIPUSH 0
ILOAD x
ISUB //metto in cima allo stack -x
BIPUSH 1
ISUB //sottraggo 1 a -x e lo metto in cima allo stack
IRETURN
.end-method