Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    28

    [JAVA] Conversione intero - binario

    Salve a tutti del forum,
    sono un nuovo utente con solamente 10 giorni di java sulle spalle..quindi mi scuso in anticipo se ho scritto castronerie.
    Per riuscire a capirci qualcosa,oltre lo studio di alcuni manuali sto cercando di analizzare riga x riga alcuni esempi di esercizi per vedere di aver chiari i concetti,ma aimè questo proprio non lo capisco.
    Ho cercato nel forum e su internet ma non sono riuscito a risolvere il mio dubbio ( forse xkè eccessivamente banale ).
    Conversione da un intero positivo ad un binario:
    ...
    char s;
    final int base = 2;
    int cif,num;
    num = Console.leggiIntero();
    while (num != 0)
    {cif = num%base; // Mi restituisce le cifre binarie
    num = num/base; // fa andare avanti il ciclo finchè la condizione è rispettata
    s = (char) (cif + '0'); //Conversione da intero a carattere
    Console.scriviUnCarattere(s);//risultato a video
    }
    Console.nuovaLinea();
    }
    }

    Se non ho capito male le operazioni che il ciclo while farebbe se inserisco un numero a tastiera (es:18) dovrebbero esser queste:
    18%2=0
    18/2=9

    9%2=1
    9/2=4

    4%2=0
    4/2=2

    2%2=0
    2/2=1

    1%2=1
    1/2=0

    Il mio dubbio però riguarda la conversione:
    s = (char) (cif + '0');
    Soprattutto non capisco la somma della codifica carattere '0' in pratica a cosa serve.
    La conversione non va fatta moltiplicando il nuovo tipo fra parentesi tonde per il tipo che si vuole convertire?
    Essendo un carattere 0 lo metto tra apici singoli,ma perchè sommato a cif?
    Se lo tolgo e lascio la riga c = (char) cif, (sempre inserendo 18) mi appaiono 2 caratteri strani.

    E' una cosa banale,lo so ma se non capisco la logica di quello che c'è scritto non vado da nessuna parte.

    Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Ciao,

    Spero di rispondere a tutto.
    Dunque... il metodo utilizzato è un pò "contorto" (più che altro effettua cose che possono essere evitate; lo scopo sarà appunto didattico).

    La conversione non va fatta moltiplicando il nuovo tipo fra parentesi tonde per il tipo che si vuole convertire?
    La conversione da un numero in base 10 ad un numero in base 2, la fai dividendo il numero N in base 10 per 2, sino a che ottieni 0. Tu dovrai considerare i singoli resti della divisione, ecco perchè fa: cif = num%base;
    codice:
    Esempio:
    
    10 / 2   r  0
    5 / 2     r  1
    2/2       r  0
    1/2       r  1
    
    Risultato (si legge sempre dal basso): 1010 che corrisponde proprio a 10

    Essendo un carattere 0 lo metto tra apici singoli,ma perchè sommato a cif?
    La somma tra cif ed il carattere 0 viene fatta per ottenere il numero cif come carattere (ma sempre cif). Ovvero, se cif = 1; lui ottiene '1';

    Nella tabella ASCII il carattere '0' corrisponde al numero decimale 48. Se prendi invece il numero 0 ottieni il carattere NULL (che fa parte dei primi 32 caratteri che non sono rappresentabili). Da qui l'ovvia conseguenza:

    codice:
    Esempio: abbiamo un resto 0
    
    0 + '0' = 0 + 48 = 48
    (char) 48 = '0'
    La somma tra caratteri è una somma tra numeri semplicemente. Il numero uno è la stessa cosa. Ovvero, hai il numero 1 (carattere SOH nella tabella ASCII), e lo sommi al carattere '0' (48 in decimale); ottieni quindi 48+1 = 49, che trasformato in carattere corrisponde al carattere '1'.

    Se lo tolgo e lascio la riga c = (char) cif, (sempre inserendo 18) mi appaiono 2 caratteri strani.
    Come detto li sopra i primi 32 caratteri non sono rappresentabili... quindi se trasformi cif (che corrisponde a 0 o 1, avendo il resto dell'operazione), converti in carattere SOH, o NULL...e non è rappresentabile!

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613

    Re: [JAVA] Conversione intero - binario

    Originariamente inviato da eonta
    Salve a tutti del forum,
    sono un nuovo utente con solamente 10 giorni di java sulle spalle..quindi mi scuso in anticipo se ho scritto castronerie.
    Per riuscire a capirci qualcosa,oltre lo studio di alcuni manuali sto cercando di analizzare riga x riga alcuni esempi di esercizi per vedere di aver chiari i concetti,ma aimè questo proprio non lo capisco.
    Ho cercato nel forum e su internet ma non sono riuscito a risolvere il mio dubbio ( forse xkè eccessivamente banale ).
    Conversione da un intero positivo ad un binario:
    ...
    char s;
    final int base = 2;
    int cif,num;
    num = Console.leggiIntero();
    while (num != 0)
    {cif = num%base; // Mi restituisce le cifre binarie
    num = num/base; // fa andare avanti il ciclo finchè la condizione è rispettata
    s = (char) (cif + '0'); //Conversione da intero a carattere
    Console.scriviUnCarattere(s);//risultato a video
    }
    Console.nuovaLinea();
    }
    }

    Se non ho capito male le operazioni che il ciclo while farebbe se inserisco un numero a tastiera (es:18) dovrebbero esser queste:
    18%2=0
    18/2=9

    9%2=1
    9/2=4

    4%2=0
    4/2=2

    2%2=0
    2/2=1

    1%2=1
    1/2=0

    Il mio dubbio però riguarda la conversione:
    s = (char) (cif + '0');
    Soprattutto non capisco la somma della codifica carattere '0' in pratica a cosa serve.
    La conversione non va fatta moltiplicando il nuovo tipo fra parentesi tonde per il tipo che si vuole convertire?
    Essendo un carattere 0 lo metto tra apici singoli,ma perchè sommato a cif?
    Se lo tolgo e lascio la riga c = (char) cif, (sempre inserendo 18) mi appaiono 2 caratteri strani.

    E' una cosa banale,lo so ma se non capisco la logica di quello che c'è scritto non vado da nessuna parte.

    Grazie
    Non ho letto tutto il codice (che dovresti mettere fra tag [CODE] per rendere il tutto più leggibile e mantenerne l'indentazione), ma suppongo che cif sia una cifra decimale. Se ho capito la domanda: i char in Java sono caratteri Unicode (se non conosci la codifica cerca su Google, è una semplice tabella dove ogni carattere è associato ad un numero), dove le dieci cifre decimali sono tutte "contigue". Se al carattere '0' aggiungi il numero 2 ad esempio, e converti il risultato in char, ciò che ottieni è il carattere che nella tabella sta due posizioni dopo il carattere '0', che è proprio '2'. Ovviamente funziona con tutte le cifre allo stesso modo.

    Facendo semplicemente un casting diretto come suggerisci, temo che il risultato sarebbe il carattere alla posizione X, dove X è l'intero che stai convertendo. Con buone probabilità che sia qualche porcheria illeggibile.

    EDIT: ecco lì, anticipato XD è stato anche più chiaro

  4. #4
    Utente di HTML.it L'avatar di yuno
    Registrato dal
    Apr 2010
    Messaggi
    62
    ciao, la cose è abbastanza banale infatti, ma è un po sbagliata l'implementazione... il char è un carattere singolo la conversione a numero ti da semplicente il numero corrispondente al carattere ascii per farti un esempio se metti char c=123; la stampa a video ti dovrebbe dare la parentesi graffa(sempre se non ricordo male rispetto alla tabella dei valori ASCII), comunque è sbagliato solo quello, cerco ora di spiegarmi per farti capire dirti come fare e basta magari non ti aiuterebbe...
    Allora per trasformare in matemateca un numero in base 10 in un numero in base 2 i passaggi sono semplici: dividiamo il numero n volte per 2 singolarmete fino a quando non è più possibile dividerlo, quindi prendiamo i resti delle singole divisioni che rappresentano i bit. Esempio
    vogliamo trasformare il 6 in binario:
    6/2=3 resto [0] (bit meno signficativo)
    3/2=1 resto [1]
    1/2=0 resto [1] (bit significativo)
    il numero binario ottenuto è 110 che equivale a 6

    vogliamo trasformare 9 in binario:
    9/2=4 resto [1] 2^0 (bit meno significativo)
    4/2=2 resto [0] 2^1
    2/2=1 resto [0] 2^2
    2/1=1 resto [1] 2^3(bit significativo)
    il numero binario ottenuto e 1001 che equivale a 9

    adesso in java l'operatore % non da il valore binario ma il resto della divisione per quello lo usi,
    per quanto riguarda adesso la programmazione tu usi console per stampare a video stampi un carattere alla volta e poi chuiudi la linea, va benissimo potresti direttamete stampare il numero cif eliminando la riga sbagliata con quel CASTING NON MOLTIPLICAZIONE che è una cosa che si puo fare ma non prendere alla leggera visto che non è sempre possibile farla e puoi fare casting ma con possibile perdita di informazioni.
    Spero di esserti stato di aiuto

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    147
    Assolutamente tutto giusto quanto ti è stato già suggerito e se ti stai appena avvicinando a Java fai più che bene ad esercitarti anche con piccoli "esercizi", tuttavia ti consiglio di studiare (magari parallelamente) la vastissima documentazione che Oracle mette a disposizione... E' talmente vasta che, non scherzo, va capito come utilizzarla... Il vantaggio è che esistono funzioni di default che già fanno quello che ti serve e che quindi ti fanno risparmiare tempo, fatica ed eventuali errori...
    Tornando al tuo problema, ad esempio, con una singola riga di codice puoi avere un intero (che è di 32 bit) convertito in binario (quindi di 32 cifre) così:

    codice:
    int pippoNumerico = 345564; 
    
    String pippoStringaBinaria = new String(String.format("%32s",Integer.toBinaryString(pippoNumerico)).replace(" ","0"));

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da watermark

    codice:
    int pippoNumerico = 345564; 
    
    String pippoStringaBinaria = new String(String.format("%32s",Integer.toBinaryString(pippoNumerico)).replace(" ","0"));
    lo trovo un po macchinoso come algoritmo e soprattutto non fai capire bene cosa fai, fatto in questo modo potresti dividere l'istruzione (sarebbe meglio)

    codice:
    int decimale = 10; 
    String binaria = Integer.toBinaryString(decimale);
    e con questo hai già provveduto al passaggio intero/binario
    Se hai un errore qui (e ce ne possono essere) è più facile capire cosa succede.
    Poi devi paddare a 32.

    codice:
    binaria = String.format("%32s", binaria).replaceAll(" ", "0");
    Ma se hai problemi di performance questo approccio mi sembra il meno adatto (crei in pratica 3 stringhe ogni volta che vuoi passare un numero da decimale a binario).
    Inoltre replace chiama replaceAll, facile sbagliare tra un apice e doppio apice, ma nel secondo caso usi direttamente le librerie Pattern togliendo un livello di uso. Inoltre se ti interessano le prestazioni, costruisci il pattern fuori e cambi solo la stringa (utile se devi fare ste trasformazioni dentro cicli) modificando il codice poco e niente
    RTFM Read That F*** Manual!!!

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    147
    Assolutamente d'accordo.

    Tuttavia dipende dalla finalità del codice, è ovvio che in un ambiente di produzione penserei anche all'ottimizzazione e a tutti i controlli del caso.

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    chiaro, sono solo osservazioni, ma ti assicuro (per esperienza) che è meglio prendere buone abitudini quando si studia che correggere difetti quando certi concetti sono blocchi monolitici enormi nella nostra testa!!!
    RTFM Read That F*** Manual!!!

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    28
    X cominciare GRAZIE a tutti x le celeri e dettagliate risposte;sono state tutte ben + k utili.
    Dovrei aver capito il mio dubbio sul xkè della somma (cif + '0') ed ho provato a vedere l'esempio opposto da binario a digitale k utilizza un ciclo do while:


    public class CalcolaInt
    { public static void main (String[] args)
    { char c; final int base = 2; int risultato = 0;
    Console.scriviStringa("Inserisci numero Binario");
    c = Console.leggiUnCarattere();
    do
    { risultato = risultato * base + (c-'0');
    c = Console.leggiUnCarattere();
    }
    while ( c >='0' && c <='1');
    Console.scriviIntero(risultato);
    }
    }

    Quindi nel corpo del do x calcolare il risultato si esegue la formula seguente (es:10010)

    0*2 + (1-'0') e quindi--- 0*2 +(49-48)=1
    1*2 + (0-'0') --- 1*2 + (48-48)=2
    2*2+ (48-48)=4
    4*2+ (49-48)=9
    9*2+ (48-48) =18

    Una volta esauriti i caratteri numerici la condizione del ciclo while è esaurita e mi sputa fuori l'ultimo risultato (18).
    A questo punto ho provato ad inserire uno spazio prima della mia serie numerica (_10010) e il valore ultimo k mi sputa fuori è -494, risultato k facendo i calcoli mi torna:
    0*2 + (32-48)= -16
    -16*2 +1 =-31
    -31*2 +0 = -62 //e così via,fino ad arrivare alla lettura dell'ultimo carattere con il ris. -494. Se però confronto il risultato con la condizione del mio ciclo While non mi torna più:
    se il primo carattere k leggo è uno spazio ed io ho dichiarato che il carattere deve essere
    c >='0' && c <='1',non dovrebbe darmi errore (visto k il carattere spazio non è menzionato)
    Se però faccio precedere la mia serie di caratteri 2 o + spazi il risultato sarà sempre -16 e questo invece non mi torna nemmeno facendo i conti. .

    Grazie in anticipo..

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.