I bitwise di Java con­sen­to­no di ma­ni­po­la­re i singoli bit a proprio pia­ci­men­to. I sette operatori sono sempre strut­tu­ra­ti 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 lin­guag­gio di pro­gram­ma­zio­ne. Questi offrono, infatti, molte fun­zio­na­li­tà, tra cui la pos­si­bi­li­tà di ma­ni­po­la­re le più piccole unità di in­for­ma­zio­ne possibili. Questi bit (binary digits) hanno un proprio sistema numerico basato sui valori 0 e 1. Per in­ter­ro­ga­re i valori binari bit per bit in Java è dunque ne­ces­sa­rio un operatore bitwise, ap­pli­ca­bi­le ai dati di tipo numerico (byte, char, int, short, long).

Questa funzione viene uti­liz­za­ta raramente, ma in alcuni casi può rivelarsi molto utile. Ad esempio, quando si ha bisogno di ri­spar­mia­re spazio durante la con­ver­sio­ne dei dati, quando si utilizza l’operatore XOR o quando si ha l’effettiva necessità di mo­di­fi­ca­re un unico bit. Questi operatori sono anche la base per tutte le ope­ra­zio­ni dei circuiti superiori. Sono dunque svariati i motivi per cui può valere la pena ap­pren­de­re le fun­zio­na­li­tà di base dei bitwise di Java.

Web Hosting
Diventa il n°1 della rete con il provider di hosting n°1 in Europa
  • Di­spo­ni­bi­li­tà garantita al 99,99%
  • Dominio, SSL ed e-mail inclusi
  • As­si­sten­za 24/7 in lingua italiana

Quanti e quali sono gli operatori bitwise di Java?

In Java esistono in totale sette diversi operatori bitwise. Per fa­ci­li­ta­re la com­pren­sio­ne, uti­liz­ze­re­mo i due operandi “a” e “b”.

  • ~ (Com­ple­men­to o “bitwise NOT”): questo operatore inverte tutti i bit. 0 diventa così 1 e 1 diventa 0.
  • & (“bitwise AND”): questo operatore re­sti­tui­sce 1 se entrambi gli operandi sono anch’essi 1. In caso contrario, viene emesso uno 0.
  • | (“bitwise OR”): questo operatore re­sti­tui­sce 1 se anche uno dei due operandi ha questo valore.
  • ^ (XOR o “bitwise OR esclusivo”): questo operatore re­sti­tui­sce 0 se entrambi gli operandi hanno lo stesso valore. In caso contrario, emette un 1.
  • << (Spo­sta­men­to a sinistra): questo operatore sposta l’operando a di b posizioni verso sinistra. Se si ottengono degli spazi, questi vengono riempiti con 0.
  • >> (Spo­sta­men­to a destra con segno, arit­me­ti­co): 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’ese­cu­zio­ne, rimane impostato anche dopo. I numeri negativi rimangono tali.
  • >>> (Spo­sta­men­to 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 è rap­pre­sen­ta­to 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. Ap­pli­can­do l’operatore, viene cambiato ogni bit del numero. L’operatore trasforma 10100 in 01011. Questo è il valore dell’espres­sio­ne “~20”. Ri­con­ver­ten­do 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 cor­ret­ta­men­te, 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 con­fron­ta­to con il primo bit del secondo numero, il secondo con il secondo bit e così via. Se entrambi i bit cor­ri­spon­do­no 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 con­fron­tia­mo questi due numeri tra loro e de­ter­mi­nia­mo un terzo numero a partire da essi. Per una migliore visione d’insieme, li scri­ve­re­mo uno sotto l’altro:

18 = 10010 25 = 11001

I primi due bit cor­ri­spon­do­no 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, esa­mi­nan­do entrambi i numeri bit per bit, otteniamo il numero binario 10000. Con­ver­ten­do­lo 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 dif­fe­ren­za dell’operatore AND, però, solo uno dei due operandi deve avere il valore 1 per ottenere il risultato 1. Ri­pren­den­do i numeri 18 e 25 dell’esempio pre­ce­den­te, si ottiene questo risultato:

18 = 10010 25 = 11001

Poiché tutti i bit, tranne la terza cifra, con­ten­go­no almeno un 1, questo terzo numero risulta: 11011. Con­ver­ten­do­lo, 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 dif­fe­ren­za è che mentre con OR uno o entrambi gli operandi devono essere 1, XOR produce un 1 solo se esat­ta­men­te 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. Pro­se­guen­do, avremo il terzo numero 01011, che in forma decimale equivale a 11.

Questo è il codice cor­ri­spon­den­te:

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

Spo­sta­men­to a sinistra

Nello spo­sta­men­to a sinistra vengono spostati i bit del valore a verso sinistra di una distanza pari a b. Gli spazi vuoti ri­sul­tan­ti vengono riempiti con 0. Questo può essere fa­cil­men­te il­lu­stra­to uti­liz­zan­do un valore int che occupa 32 bit in una memoria. Prendiamo di nuovo il numero a come 20 o 10010 e spo­stia­mo­lo del valore b di 2 per ottenere il valore c 1001000. Ciò significa che due zeri vengono posti alla fine. 1001000 cor­ri­spon­de al valore decimale 72.

Di seguito ri­por­tia­mo 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

Spo­sta­men­to a destra con segno

Lo spo­sta­men­to 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 cor­ri­spon­den­te:

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

È im­por­tan­te notare che se a è un numero positivo, gli spazi vengono riempiti con 0. Se è negativo, gli spazi vengono so­sti­tui­ti con 1.

Spo­sta­men­to a destra senza segno

L’operatore Java bitewise di spo­sta­men­to a destra senza segno (>>>) funziona esat­ta­men­te allo stesso modo. L’unica dif­fe­ren­za è che gli spazi creati sul lato sinistro da uno spo­sta­men­to a destra sono sempre riempiti con 0. In questo modo il risultato è sempre un numero positivo, anche se il valore era pre­ce­den­te­men­te negativo.

Vai al menu prin­ci­pa­le