CalcolatoreBinario.java
Created with JBuilder |
class CalcolatoreBinario {
// Attributi per la gestione della memoria
private long memoria;
private long ultimoRisultato;
// Attributo per la segnalazione di errori in fase di conversione
private boolean erroreConversione;
// Costruttore
public CalcolatoreBinario() {
memoria = 0;
erroreConversione = false;
}
///////////////////////////////////////////////////////////////////////////
// Metodi per le operazioni aritmetiche
///////////////////////////////////////////////////////////////////////////
public String somma(String a, String b) {
long x = daBinario(a);
long y = daBinario(b);
return risultato(x + y);
}
public String sottrai(String a, String b) {
long x = daBinario(a);
long y = daBinario(b);
return risultato(x - y);
}
public String moltiplica(String a, String b) {
long x = daBinario(a);
long y = daBinario(b);
return risultato(x * y);
}
public String dividi(String a, String b) {
long x = daBinario(a);
long y = daBinario(b);
// Nota: divisione tra interi!
return risultato(x / y);
}
///////////////////////////////////////////////////////////////////////////
// Metodi per la gestione della memoria
///////////////////////////////////////////////////////////////////////////
public void mettiInMemoria() {
memoria = ultimoRisultato;
}
public void sommaInMemoria() {
memoria += ultimoRisultato;
}
public String richiamaMemoria() {
return aBinario(memoria);
}
public void cancellaMemoria() {
memoria = 0;
}
///////////////////////////////////////////////////////////////////////////
// Metodi private
///////////////////////////////////////////////////////////////////////////
// Questo metodo gestisce il risultato in presenza di eventuali errori
private String risultato(long z) {
if (erroreConversione) {
erroreConversione = false;
return null;
} else {
ultimoRisultato = z;
return aBinario(ultimoRisultato);
}
}
// Conversione da binario a decimale
private long daBinario(String bin) {
// Priva bin di tutti gli eventuali spazi in cima e in fondo
String binEsatto = bin.trim();
// La lunghezza di binEsatto è ora pari al numero di cifre significative
int cifreSignificative = binEsatto.length();
long dec = 0;
// Scorre binEsatto da sinistra (bit più significativo) a destra
// (bit meno significativo), cioè dall'inizio alla fine della stringa
for (int i = 0; i < cifreSignificative; i++) {
if (binEsatto.charAt(i) != '1' && binEsatto.charAt(i) != '0') {
// Se il carattere non è 1 oppure 0, segnala un errore di conversione
erroreConversione = true;
return dec;
} else if (binEsatto.charAt(i) == '1') {
// Un '1' in posizione p a partire da sinistra vale
// 2^(cifresignificative - i)
dec += Math.round(Math.pow(2,(cifreSignificative - i - 1)));
}
}
return dec;
}
// Conversione da decimale a binario
private String aBinario(long dec) {
StringBuffer bin = new StringBuffer("");
while (dec > 0) {
if ((dec % 2) == 1) {
bin.append(1);
} else {
bin.append(0);
}
dec /= 2;
}
if (bin.length() == 0) {
bin.append(0);
} else {
// Nota: bin contiene il numero binario con le cifre meno significative
// a sinistra (sono le prime ad essere inserite): è necessario rovesciarlo
bin.reverse();
}
return bin.toString();
}
}
CalcolatoreBinario.java
Created with JBuilder |