.constant
valx 0x79
objref 0x0
.end-constant
.main
.var
z
.end-var
LDC_W objref
LDC_W valx
INVOKEVIRTUAL contabit
// DUP
OUT
HALT
.end-main
.method contabit(p)
.var
a
x //Maschera
count //Contatore
.end-var
BIPUSH 1
ISTORE a
BIPUSH 1 //Inizializzo la maschera a 0000...0001 (32bit)
ISTORE x
BIPUSH 0 //Inizializzo il contatore a 0
ISTORE count
e1: ILOAD x //Se la maschera è 0 significa che ho
//controllato tutti e 32bit
//(è a 0 perchè è andata in overflow)
IFEQ fine //Quindi salto a fine
ILOAD x //Carico la maschera
ILOAD p //Carico il numero
IAND //Ne faccio l'and logico
IFEQ e2 //Se è 0 significa che il bit che sto
//controllando è 0
IINC count 1 //Se invece non è 0, significa che è presente
//un 1 e quindi incremento il contatore
e2: ILOAD x //Faccio uno shift a sinistra di 1 bit della
//maschera
DUP
IADD
ISTORE x
GOTO e1 //Ripeto il controllo
fine: ILOAD count //Metto sullo stack il contatore
BIPUSH 1
IAND
IFEQ pari
// BIPUSH 0x1 // torna 1 se è dispari
BIPUSH 1
ILOAD a
IRETURN
pari: BIPUSH 0x0 //torna zero se è pari
IRETURN
.end-method