Si da il caso che quest’anno all’università mi ritrovo a scrivere programmi in Java, dato che il modulo di Laboratorio di Programmazione della mia facoltà prevede questo linguaggio.
Sebbene io disprezzi questo linguaggio di programmazione per una serie di motivi validi, al contrario scrivere, compilare e vedere che un mio programmino in Java funziona bene, è una soddisfazione troppo grande.
Ne avrò scritti una trentina finora, molti di prova e pochi realmente utili e funzionanti.
Come, in questo caso, quello della conversione da numero intero decimale a binario. All’inizio pensavo che richiedeva una grande mole di codice, e invece quando mi si è accesa la famosa lampadina stile “Eureka!” tutto mi era chiaro. E il codice è quasi una bazzecola. Eccovelo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | class convertbin { public static void main (String[]args) { int b = Integer.parseInt(args[0]); String s = new String(); System.out.print("Il valore binario di "+b+" è "); if (b == 0) System.out.println("0"); else { while (b > 0) { int m = b % 2; b = b / 2; if (m == 1){ s = 1+s; } else { s = 0+s; } } } System.out.println(s); } } |
Per usarlo bisogna avere JDK installato, compilarlo con un “javac convertbin.java” e farlo partire con un bel “java convertbin numero“, dove numero è il parametro args di input. Ovvero il numero che verrà trascritto in binario da java.
Vi pregherei di non linciarmi se il codice dovesse risultarvi “così banale” o “imperfetto“, o ancora “da stupidi“, ma se avete suggerimenti o segnalazioni più in basso esiste il form per scrivere commenti. Coraggio, scatenatevi!
Adesso che questo pezzetto di codice è stato “archiviato”, posso dedicarmi a scrivere un altro programma di ben altro calibro. Staremo a vedere.
EDIT: Come volevasi dimostrare, ecco che mi hanno appena massacrato con un codice ancora più snello, fornito da scimmia:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class convertbin { public static void main (String[]args) { int b = Integer.parseInt(args[0]); String s = new String(); System.out.print("Il valore binario di "+b+" è "); if (b == 0) System.out.println("0"); else { while (b > 0) { int m = b % 2; b = b / 2; s = m+s; } } System.out.println(s); } } |
O qualcun’altro vuole massacrare anche scimmia?





























while (b > 0) {
int m = b % 2;
b = b / 2;
s = m+s;
}
cosi fai prima no?
Rispondi al commento di scimmia
T’hanno ammazzato con questo commento
Cmq ben fatto!
Rispondi al commento di Napolux
Come mai disprezzi Java?
Io tutti questi motivi validi non li trovo
Rispondi al commento di wisher
@scimmia: Già! Lo dicevo io che era una baggianata.
@Napolux: Massacrato è il termine esatto, ma sono lo stesso fiero di esserci riuscito in un modo o l’altro senza copiare. D’altronde sono ancora agli inizi.
@wisher: È pesante se vuoi far partire applicazioni java, anzitutto. Ma anche per molte altre cose che non ti sto ad elencare.
Rispondi al commento di Piplos
aggiungo solo una cosa. una piccola nota.
dipende certamente dallo scopo del tuo programma e dove verrà usato, ma una buona norma in sicurezza è scrivere funzioni o algoritmi che non debbano fare dei test e procedere per due rami differenti a seconda del risultato. infatti se i rami sono diversi si possono montare i famosi “side channel attacks”.
altra cosa, secondo me è possibile sbarazzarsi di quel if, prova a farlo, ma probabilmente devi cambiare appena appena il flusso del programma.
altra bazzeccola, se devi fare le divisioni/moltiplicazioni per potenze di 2, usa gli spostamenti a dx e a sx, sono istruzioni più rapide. (va anche detto che i compilatori lo sanno e di solito li sostituiscono da sé se si compila con un minimo di ottimizzazione).
Rispondi al commento di scimmia
@Piplos: Mah a me non pare così pesante.
Inoltre i pregi di Java dal punto di vista della programmazione (sia per l’OOP che per l’immensa disponibilità di librerie) non sono indifferenti.
Rispondi al commento di wisher
@wisher: Ma basta vedere le piccoli (ma proprio piccolissime) applet java (non javascript, attenzione) ed accorgersi del tempo che ci mettono per caricarsi e della pesantezza di Java fatto partire apposta per leggere l’applet.
Ma dai, non ci sono paragoni con altri linguaggi. Vedasi PHP (leggerissimo) e Python (se proprio vogliamo sviluppare per desktop), eccetera eccetera.
Rispondi al commento di Piplos
@Piplos: Non credo che il tempo con cui si avvia la JRE sia l’unica metrica con cui valutare la bontà di Java.
Da questo punto di vista soffre un po’, secondo me neanche troppo. Ma visto quello che offre la piattaforma Java credo che ne valga la pena. Questo ovviamente IMHO, io però sono di parte.
Comunque mi fa piacere che come linguaggio per desktop citi Python e non il C. Non fosse così dinamico (a volte lo è addirittura troppo) python non mi dispiacerebbe per nulla.
Rispondi al commento di wisher
A me da:
Exception in thread “main” java.lang.ArrayIndexOutOfBoundException: 0
at convertbin.main(convertbin.java:3)
Rispondi al commento di Egeo
@Egeo:
Sicuramente perché lo avvii senza passare parametri, quindi args[] avrà valore null. All’inizio del programma, nella seguente riga:
int b = Integer.parseInt(args[0])Si fa riferimento alla posizione 0 del vettore, senza tenere in considerazione il fatto che possa non esistere, come accade nel tuo caso.
Rispondi al commento di Nexos
http://corsairtux.blogspot.com/2009/11/convertire-un-intero-in-binario-metodo.html
che te ne pare?
Rispondi al commento di Corsair