# 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](https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/operatori-java/) sono uno strumento prezioso per chi lavora con il [linguaggio di programmazione](https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/linguaggi-programmazione-web/). 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.

## 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.
- **&amp; (“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.
- **&lt;&lt; (Spostamento a sinistra)**: questo operatore sposta l’operando a di b posizioni verso sinistra. Se si ottengono degli spazi, questi vengono riempiti con 0.
- **&gt;&gt; (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.
- **&gt;&gt;&gt; (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](https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/comandi-java/) `System.out.println`.

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

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:

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

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ì:

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

## 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:

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

## 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:

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

## 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:

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

È 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 (&gt;&gt;&gt;) 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.


This is a markdown version of: [https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/operatori-bitwise-di-java/](https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/operatori-bitwise-di-java/) for AI/LLM consumption.