giovedì 5 novembre 2009

Convertire un intero in binario metodo 1 (Java)

L'obiettivo di questo esercizio come al solito è lo sviluppo e l'implementazione di un algoritmo che dato un numero intero (int) in base 10 restituisca i 32 rispettivi bit in base 2.

Per la soluzione di questo problema era stato richiesto l'utilizzo dell' operatore & (and tra numeri binari) e dell'operatore <<>> che spostano del numero di "posti" indicato i bit a destra o a sinistra.

L'operatore and controlla ogni bit di un numero con il rispettivo dell'altro numero e restituisce 1 solo se tutti e due i bit dei due numeri sono 1:

Esempio:

dati: x=654364363 e y=500348320 che sono rispettivamente:

x = 00100111 00000000 11001110 11001011
y = 00011101 11010010 10110101 10100000

x & y sara:
c = 00000101 00000000 10000100 10000000

Se come y prendiamo il numero tale che i bit di quel numero siano 0 tranne uno che sia 1 nella posizione interessata, possiamo ricavare il valore del bit di quella posizione tramite la formula

(x & y)/y

Se vogliamo ricavare la cifra di posizione 8 (da dx verso sx)
prendiamo y = 128

y = 00000000 00000000 00000000 10000000

da x & y riotteniamo y così (x & y)/y ci darà "1" (che è il valore dell'ottava cifra!)

Se invece l'ottava cifra di x fosse stata 0, x&y avrebbe restituito 0 (00000000 00000000 00000000 00000000) e (x & y)/y in questo caso sarebbe stato 0 (proprio come l'ottava cifra!)

Dopo ave capito questo procedimento occorre implementare un algoritmo che indichi tramite un ciclo tutte le varie cifre.

Io ho fatto 2 programmi che sono in grado di convertire qualsiasi numero in binario, uno più semplice ma che restituisce un risultato meno immediato come questo ad esempio:

1
1
0
1
0
0
1
1
0
1
1
1
0
0
1
1
0
0
0
0
0
0
0
0
1
1
1
0
0
1
0
0

(la prima cifra dell'elenco è quella che andrà a destra! e non a sinistra)

il codice di questo primo programma è il seguente:

  1. public class Bincon1

  2. {

  3.    public static void main (String[] args)

  4.    {

  5.       int a = 654364363;

  6.       int b = 1;

  7.       int c = 0;

  8.       while (c<32)

  9.       {

  10.          int cifra = ( a & b ) / b;

  11.          b = b << 1;

  12.          c++;

  13.          System.out.println(cifra);

  14.       }

  15.    }

  16. }



L'altro programma un tantino + complicato parte invece da sx e ricava le cifre verso dx (la prima cifra si ricava a parte...) ha il vantaggio di restituire un risultato ordinato e più gradevole!

il codice è:


  1. public class Bincon2

  2. {

  3.    public static void main (String[] args)

  4.    {

  5.       int a = 500348320;

  6.       int b = 1073741824;//01000000 00000000 00000000 00000000

  7.       int c = 31;

  8.       if (a<0)//assegnazione valore prima cifra

  9.          System.out.print("1");

  10.       else

  11.          System.out.print("0");

  12.      

  13.       while (c>0)// stampa delle altre 31 cifre

  14.       {

  15.          int cifra = ( a & b ) / b;

  16.          b = b >> 1;

  17.          c = c -1;

  18.          System.out.print(cifra);

  19.       }

  20.    }

  21. }



Questo programma restituisce un risultato del tipo : 00100111000000001100111011001011
esiste un altro programma che riesce a risolvere questo problema in un modo più classico lo potete trovare in questo post.

Potete trovare tutti i miei programmi quì.

1 commento:

  1. Ciao a tutti sto programmando da poco cn la scuola e ho bisogno di 1 aiuto il prof ha assegnato un esercizio qll di convertire :
    Realizzare un programma java che consenta di convertire numeri in basi differente in particolare:
    1)binario-->decimale
    2)decimale-->binario
    3)binario-->esadecimale
    4)esadecimale-->decimale
    consegnare:
    1)una relazione sull'esperienza con analisi del problema,algoritmo risolutivo,e trace
    2)il progetto netbeans completo del codice java e i test di funzionamento
    3) la relazione deve essere in formato pdf

    ki mi aggiunge su msne mi da na mano raga???? please francy1991@msn.com

    RispondiElimina