Operatori bitwise di Java: panoramica e funzionalità

I bitwise di Java consentono di manipolare i singoli bit a proprio piacimento. I sette operatori sono sempre strutturati in modo molto simile e seguono regole fisse facili da imparare.

Cosa sono gli operatori bitwise e a cosa servono?

Gli operatori Java sono uno strumento prezioso per chi lavora con il linguaggio di programmazione. Questi offrono, infatti, molte funzionalità, tra cui la possibilità di manipolare le più piccole unità di informazione possibili. Questi bit (binary digits) hanno un proprio sistema numerico basato sui valori 0 e 1. Per interrogare i valori binari bit per bit in Java è dunque necessario un operatore bitwise, applicabile ai dati di tipo numerico (byte, char, int, short, long).

Questa funzione viene utilizzata raramente, ma in alcuni casi può rivelarsi molto utile. Ad esempio, quando si ha bisogno di risparmiare spazio durante la conversione dei dati, quando si utilizza l’operatore XOR o quando si ha l’effettiva necessità di modificare un unico bit. Questi operatori sono anche la base per tutte le operazioni dei circuiti superiori. Sono dunque svariati i motivi per cui può valere la pena apprendere le funzionalità di base dei bitwise di Java.

Il tuo web hosting come mai prima d'ora
  • Certificato SSL e protezione DDoS
  • Velocità, flessibilità e scalabilità
  • Dominio e consulente personale
  • 1 anno gratis del gestionale di fatturazione elettronica FlexTax

Quanti e quali sono gli operatori bitwise di Java?

In Java esistono in totale sette diversi operatori bitwise. Per facilitare la comprensione, utilizzeremo i due operandi “a” e “b”.

  • ~ (Complemento o “bitwise NOT”): questo operatore inverte tutti i bit. 0 diventa così 1 e 1 diventa 0.
  • & (“bitwise AND”): questo operatore restituisce 1 se entrambi gli operandi sono anch’essi 1. In caso contrario, viene emesso uno 0.
  • | (“bitwise OR”): questo operatore restituisce 1 se anche uno dei due operandi ha questo valore.
  • ^ (XOR o “bitwise OR esclusivo”): questo operatore restituisce 0 se entrambi gli operandi hanno lo stesso valore. In caso contrario, emette un 1.
  • << (Spostamento a sinistra): questo operatore sposta l’operando a di b posizioni verso sinistra. Se si ottengono degli spazi, questi vengono riempiti con 0.
  • >> (Spostamento a destra con segno, aritmetico): questo operatore sposta tutti i bit di a verso destra di b posizioni. Se il bit con il valore più alto era già impostato prima dell’esecuzione, rimane impostato anche dopo. I numeri negativi rimangono tali.
  • >>> (Spostamento a destra senza segno, logico): questo operatore sposta i bit di a verso destra di b posizioni. Gli spazi vengono sempre riempiti con 0.

Bitwise NOT

L’operatore bitwise di Java NOT è rappresentato da una tilde (~). Esso nega tutti i bit e quindi trasforma gli zeri in uno e gli uno in zero. Per il nostro esempio, prendiamo il numero 20, che come numero binario si presenta così: 10100. Applicando l’operatore, viene cambiato ogni bit del numero. L’operatore trasforma 10100 in 01011. Questo è il valore dell’espressione “~20”. Riconvertendo questo numero binario in un numero decimale, otteniamo il valore -21. Per provare questo processo nel codice, inserisci quanto segue per ottenere un output con il comando Java System.out.println.

public class Main {
	public static void main(String[] args) {
	int num = 20;
	System.out.println(~num);
}
}
java

Se tutto è stato inserito correttamente, il risultato ottenuto dovrebbe essere “-21”.

Bitwise AND

L’operatore bitwise AND confronta due numeri nella loro forma binaria bit per bit. Il primo bit del primo numero viene confrontato con il primo bit del secondo numero, il secondo con il secondo bit e così via. Se entrambi i bit corrispondono a 1, viene emesso un 1. In caso contrario, poiché entrambi i bit o solo uno di essi è 0, viene emesso uno 0. Per il nostro esempio, prendiamo i due numeri decimali 18 e 25. 18 sotto forma di numero binario è 10010. 25 in notazione binaria è 11001. Ora confrontiamo questi due numeri tra loro e determiniamo un terzo numero a partire da essi. Per una migliore visione d’insieme, li scriveremo uno sotto l’altro:

18 = 10010 25 = 11001

I primi due bit corrispondono a 1 in entrambi i casi, quindi anche il numero che stiamo cercando inizia con 1. Sebbene il secondo bit di 25 sia anch’esso 1, il secondo bit di 18 è 0, motivo per cui anche il terzo numero continua con 0. Quindi, esaminando entrambi i numeri bit per bit, otteniamo il numero binario 10000. Convertendolo in un numero decimale, il risultato è 16.

Il codice si presenta in questo modo:

public class Main {
	public static void main(String[] args) {
	System.out.println(18&25);
}
}
java

L’output nella console dovrebbe ora essere “16”.

Bitwise OR

Anche l’operatore bitwise OR confronta due numeri bit per bit. A differenza dell’operatore AND, però, solo uno dei due operandi deve avere il valore 1 per ottenere il risultato 1. Riprendendo i numeri 18 e 25 dell’esempio precedente, si ottiene questo risultato:

18 = 10010 25 = 11001

Poiché tutti i bit, tranne la terza cifra, contengono almeno un 1, questo terzo numero risulta: 11011. Convertendolo, otteniamo quindi 27.

L’esempio nel codice si presenta quindi così:

public class Main {
	public static void main(String[] args) {
	System.out.println(18|25);
}
}
java

XOR

XOR, o bitwise OR esclusivo (^), è simile all’operatore bitwise OR. La differenza è che mentre con OR uno o entrambi gli operandi devono essere 1, XOR produce un 1 solo se esattamente uno dei due valori è anch’esso 1. Questo risulta evidente guardando il nostro esempio:

18 = 10010 25 = 11001

I primi due bit hanno un valore pari a 1, quindi con l’operatore bitwise si ottiene 0. Il secondo bit di 18 è 0, ma quello di 25 è 1. Otteniamo quindi il valore 1. Proseguendo, avremo il terzo numero 01011, che in forma decimale equivale a 11.

Questo è il codice corrispondente:

public class Main {
	public static void main(String[] args) {
	System.out.println(18^25);
}
}
java

Spostamento a sinistra

Nello spostamento a sinistra vengono spostati i bit del valore a verso sinistra di una distanza pari a b. Gli spazi vuoti risultanti vengono riempiti con 0. Questo può essere facilmente illustrato utilizzando un valore int che occupa 32 bit in una memoria. Prendiamo di nuovo il numero a come 20 o 10010 e spostiamolo del valore b di 2 per ottenere il valore c 1001000. Ciò significa che due zeri vengono posti alla fine. 1001000 corrisponde al valore decimale 72.

Di seguito riportiamo come si presenta questo processo nel codice:

public class Main {
	public static void main(String[] args) {
	int a = 20;
	int b = 2;
	int c = (a << b);
	System.out.println(c);
}
}
java

Spostamento a destra con segno

Lo spostamento a destra funziona in modo inverso. In questo caso spostiamo i bit del valore a verso destra del valore b per ottenere c. Gli ultimi bit vengono quindi omessi. Se nel nostro esempio spostiamo di due posizioni a destra il valore 20 o 10010, il risultato è 100, ovvero 4.

Questo è il codice corrispondente:

public class Main {
	public static void main(String[] args) {
	System.out.println(20 >> 2);
}
}
java

È importante notare che se a è un numero positivo, gli spazi vengono riempiti con 0. Se è negativo, gli spazi vengono sostituiti con 1.

Spostamento a destra senza segno

L’operatore Java bitewise di spostamento a destra senza segno (>>>) funziona esattamente allo stesso modo. L’unica differenza è che gli spazi creati sul lato sinistro da uno spostamento a destra sono sempre riempiti con 0. In questo modo il risultato è sempre un numero positivo, anche se il valore era precedentemente negativo.

Hai trovato questo articolo utile?
Per offrirti una migliore esperienza di navigazione online questo sito web usa dei cookie, propri e di terze parti. Continuando a navigare sul sito acconsenti all’utilizzo dei cookie. Scopri di più sull’uso dei cookie e sulla possibilità di modificarne le impostazioni o negare il consenso.
Page top