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


Soluzione Proposta da Maurizio Morgante

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

1

 

 

 

39

40

 

 

39

39

79

 

39

39

39

-40

Esempio di cosa accade nello stack

 














Una possibilita' proposta da Eugenio Rustico e' invece
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