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).

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");
  }

}

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 &&):

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");
  }

}


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

Post popolari in questo blog

Arrotondamento e troncamento in Java

Eclipse: Shortcuts (scorciatoie) da tastiera

Strutture dati: List, Set, Map

Creare un eseguibile Java