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: 0100110100111110
Rappresentazione 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