AND e OR, bit a bit e logici
DOMANDA:
Ho letto che in Java posso scrivere l'AND (o OR) con & ( | ) oppure con && ( || ). Perché c'è questa differenza? E' la stessa cosa?
RISPOSTA:
Partiamo dall'ultima domanda: no, non sono la stessa cosa.
In Java esistono due modi per effettuare l'AND e l'OR.
AND bit a bit:
Con un solo & stiamo dicendo alla Java Virtual Machine di effettuare un AND bit a bit, ovvero un'operazione binaria di questo tipo: 1010 & 1111 = 1010 (sapendo che l'AND da come risultato 1 quando da entrambe le parti c'è 1). Lo stesso con un OR bit a bit: 1010 | 1111 = 1111 (sapendo che l'OR da come risultato 1 quando da almeno una delle due parti c'è 1). Un esempio di utilizzo di AND bit a bit molto utilizzato in informatica è il calcolo delle maschere di rete (tra l'IP del pc e quello della maschera).
In Java esistono due modi per effettuare l'AND e l'OR.
AND bit a bit:
Con un solo & stiamo dicendo alla Java Virtual Machine di effettuare un AND bit a bit, ovvero un'operazione binaria di questo tipo: 1010 & 1111 = 1010 (sapendo che l'AND da come risultato 1 quando da entrambe le parti c'è 1). Lo stesso con un OR bit a bit: 1010 | 1111 = 1111 (sapendo che l'OR da come risultato 1 quando da almeno una delle due parti c'è 1). Un esempio di utilizzo di AND bit a bit molto utilizzato in informatica è il calcolo delle maschere di rete (tra l'IP del pc e quello della maschera).
L'effetto collaterale dell'AND (OR) bit a bit è di valutare tutte le espressioni prima di effettuare l'operazione.
Guardiamo un esempio:
package operatori;
public class AndBitBit {
public static void main(String[] args) {
String stringa = null;
if(stringa != null & stringa.equals("ciao"))
System.out.println("SI");
System.out.println("FINE");
}
}
public class AndBitBit {
public static void main(String[] args) {
String stringa = null;
if(stringa != null & stringa.equals("ciao"))
System.out.println("SI");
System.out.println("FINE");
}
}
Come potete vedere eseguendo il codice, viene restituita una NullPointerException perché il metodo .equals() viene chiamato su un oggetto null (questo dimostra che vengono valutate entrambe le espressioni a sinistra e a destra dell'operatore).
AND logico:
L'AND (OR) logico invece si rappresenta con && ( || ). La caratteristica è che effettua un'operazione logica di AND (OR) con corto circuito. Infatti l'operazione di sopra restituisce un risultato reale senza eccezione.
Vediamo il codice (da notare &&):
Vediamo il codice (da notare &&):
package operatori;
public class AndLogico {
public static void main(String[] args) {
String stringa = null;
if(stringa != null && stringa.equals("ciao"))
System.out.println("SI");
System.out.println("FINE");
}
}
public class AndLogico {
public static void main(String[] args) {
String stringa = null;
if(stringa != null && stringa.equals("ciao"))
System.out.println("SI");
System.out.println("FINE");
}
}
Come potete vedere, la seconda operazione non viene valutata affatto (corto circuito) e non restituisce l'eccezione lanciata con l'AND bit a bit!
Commenti
Posta un commento