Esercizio 1
Realizza un programma che ricevuto in ingresso un numero del sistema numerico decimale lo trasformi in binario, rappresentandone la forma in complemento a uno e in complemento a due .
Ricordiamo che il complemento a 1 di un numero binario,
si ottiene commutando le cifre di cui è composto (gli zeri diventano uno
e viceversa). Il complemento a due di un numero binario si ottiene sommando
un 1 al numero binario in complemento a uno precedentemente ottenuto. La
rappresentazione in complemento a due è fondamentale quando si eseguono
somme algebriche in formato binario. se prendiamo il numero 13:
(13)10=(1101)2
il complemento a uno: 0010
il complemento a due: 0011
Detta così sembra proprio di una semplicità disarmante.Adesso
dobbiamo automatizzare la procedura per farla eseguire all'elaboratore.
Prima di tutto adoperiamo un metodo ArrayList
converti(int n) per trasformare il numero
n (decimale) inserito da tastiera nel corrispondente valore binario per
come è dichiarato il metodo restituisce un oggetto ArrayList che avrà dimensione
non definita (ovviamente) e che dovrà adattarsi alla dimensione del numero
intero introdotto.
Questo risultato viene assegnato all'oggetto ArrayList che noi chiamiamo
B.
Eccezionalmente nel metodo converti(int
n) si usa l'istruzione
Collections.reverse(b);
per invertire rapidamente l'ordine degli elementi
del vettore che sta per essere restituito.
Poi eseguiamo una copia di B chiamandola B1 ottenuta con la seguente istruzione:
Questa operazione è necessaria perchè un eventuale assegnamento B1=B si
implicherebbe I ben noti effetti collaterali: in questo caso essendo B e
B1 due puntatori che si riferiscono allo stesso oggetto, un eventuale cambiamento
di B1 viene riscontrato anche in B.
Fatto stà che ci siamo procurati una copia di B, indipendente
da B. In B1 basta, ora, commutare gli zeri con gli uno e viceversa, questo
viene effettuato dal metodo ArrayList
complemento1(ArrayList b). Il vettore
B1 tornerà, dunque trasformato dall'operazione:
B1=complemento1(B1);
Questo vettore deve essere ulteriormente trasformato per diventare la rappresentazione
in complemento a due del numero binario originale. La forma in complemento
a due dovrà essere attribuita all'arraylist B2. Per 'smarcare' B2 da B1
(evitando l'assegnamento iniziale B2=B1) eseguiamo l'operazione che copia
i singoli componenti di B1 in B2:
Ma come possiamo ora aggiungere 1 al numero binario B2? Per evitare inconvenienti
passiamo B2 al metodo
ArrayList complemento2(ArrayList
b)
che prima di tutto converte il numero binario in ingresso in decimale e
poi lo passa alla funzione ArrayList
converti(int n) preesistente. C'è da aspettarsi che stavolta
tale funzione restituisca il complemento a 2 del numero originario.
Esiste sempre una discrepanza fra il numero di cifre del binario originale
e quelle del suo complemento a due. Questa differenza viene colmata dall'istruzione:
for(i=B2.size();i < size;i++)B2.add(0,0);
che riempie di 0 le cifre più significative di B2,
mancanti.
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
class complemento {
public static void main (String[] args) throws IOException{
InputStreamReader input=new InputStreamReader(System.in);
BufferedReader h= new BufferedReader(input);
int i,num,n2,size;
ArrayList B=new ArrayList(0);
ArrayList B1=new ArrayList(0);
ArrayList B2=new ArrayList(0);
System.out.print("ins.num in decimale:");
num=Integer.parseInt(h.readLine().trim());
B=converti(num); size=B.size();
for(i=0;i < B.size();i++)B1.add(B.get(i));
B1=complemento1(B1);
for(i=0;i < B1.size();i++)B2.add(B1.get(i));
B2=complemento2(B2);
stampa(B);
stampa(B1);
for(i=B2.size();i < size;i++)B2.add(0,0);
stampa(B2);
} //fine main
static void stampa(ArrayList b){
for(int i=0;i < b.size();i++)System.out.print(b.get(i));
System.out.println(" size:"+b.size());
}//fine stampa
static ArrayList converti(int n){
ArrayList b=new ArrayList(0);
do{
b.add(n%2);
n=n/2;
}while(n!=0);
Collections.reverse(b);
return b;
}//fine converti
static ArrayList complemento1(ArrayList b){
for(int i=0;i < b.size();i++)
if((Integer)b.get(i)==0)b.set(i,1);
else b.set(i,0);
return b;
}//fine complemento1
static ArrayList complemento2(ArrayList b){
int i,j=0,num=0;
for(i=b.size()-1;i >= 0;i--){
num+=(Integer)b.get(i)*Math.pow(2,j);
j++;
}//fine for
num=num+1;
b=converti(num);
return b;
}//fine complemento2
} //______fine classe complemento