edutecnica

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:

for(i=0;I < B.size();i++)B1.add(B.get(i));

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:

for(i=0;i < B1.size();i++)B2.add(B1.get(i));

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