In un programma per computer, gli operatori bit a bit sono operatori per la manipolazione di modelli di bit nelle espressioni. AND bit per bit, OR, OR esclusivo (XOR), NOT, spostamento a destra e spostamento a sinistra sono operazioni comuni. La maggior parte dei linguaggi di programmazione per computer include tutti e sei questi operatori. Sono spesso usati per impostare, cancellare o capovolgere singoli bit in programmi che controllano l’hardware del computer. Gli operatori bit a bit vengono spesso utilizzati anche nella crittografia dei dati e negli algoritmi di compressione.
Gli operatori bit a bit comuni sono generalmente rappresentati simbolicamente in linguaggi di programmazione come C, C++ e Java. Sono usati nelle espressioni proprio come lo sarebbero gli operatori aritmetici come i segni più o meno. L’operatore bit a bit AND è rappresentato con la e commerciale &, OR con la barra verticale | e XOR con il caret ^. NOT, noto anche come operatore del complemento, è indicato con una tilde ~.
L’operatore di spostamento a destra utilizza un doppio cursore che punta a destra >>. Al contrario, lo spostamento a sinistra è indicato da un doppio cursore che punta a sinistra. Java include un’altra operazione di spostamento a destra, mostrata con un triplo cursore che punta a destra >>>.
Gli operatori bit a bit applicano un’operazione logica a ciascuna coppia di bit nei loro operandi. NOT, shift a destra e shift a sinistra hanno un solo vero operando; il secondo valore nelle operazioni di spostamento è il conteggio dei bit. Per comprendere meglio come funzionano gli operatori bit a bit, un individuo può visualizzare i propri operandi come numeri binari. Ad esempio, l’operatore di complemento capovolge ogni bit del suo singolo operando nello stato opposto. Un uno diventa zero e uno zero diventa uno. Il complemento del valore binario a 8 bit 00110101 è 11001010.
L’operatore AND ha due operandi. Bit per bit, viene eseguita un’operazione AND logica utilizzando un bit corrispondente di ciascun operando. L’esito di ciascuna operazione sui bit viene posizionato in quella posizione di bit del risultato complessivo. Ad esempio, l’operatore AND elaborerà il bit 7 di un operando con il bit 7 dell’altro operando. L’esito sarà memorizzato nel bit 7 del risultato complessivo.
In un’operazione AND, entrambi i bit dell’operando devono essere uno affinché il risultato sia uno, altrimenti il risultato è zero. Ad esempio, se i valori binari a 8 bit degli operandi sono 00110101 e 11110000, il risultato sarà 00110000. Un uso comune dell’operatore AND consiste nell’azzerare determinati bit nel risultato. Questo viene fatto inserendo degli zeri in quelle posizioni di bit in uno degli operandi.
In un’operazione OR, entrambi i bit dell’operando devono essere zero affinché il risultato sia zero; altrimenti il risultato è uno. Un uso comune dell’operatore OR consiste nell’impostare alcuni bit del risultato su uno. Questo viene fatto inserendo quelli in quelle posizioni di bit in uno degli operandi. Per l’operazione XOR, il risultato è zero se entrambi i bit dell’operando sono zero o se entrambi i bit dell’operando sono uno, altrimenti il risultato è uno.
Lo spostamento a sinistra e lo spostamento a destra spostano i bit nell’operando a sinistra oa destra del numero specificato di posizioni di bit. Uno spostamento logico a destra sposta uno zero nel bit più a sinistra come parte dello spostamento. Uno spostamento aritmetico a destra copia il bit più a sinistra, il bit di segno, prima dello spostamento nella stessa posizione dopo lo spostamento. Anche il bit originale viene spostato a destra insieme al resto. Entrambi i tipi di spostamento a sinistra spostano uno zero nel bit più a destra.
Quando un operando viene spostato a destra, il bit più a destra prima dello spostamento viene semplicemente scartato. Allo stesso modo, viene eliminato il bit più a sinistra prima di uno spostamento a sinistra. Non si avvolge all’altra estremità dell’operando.
Le operazioni di spostamento bit per bit dipendono dalla lingua e dall’implementazione. Ad esempio, in C e C++, >> ed esegue spostamenti logici se l’operando è un intero senza segno. Se l’operando è un intero con segno, è probabile che venga eseguito invece uno spostamento aritmetico. In Java, tutti gli operandi sono considerati con segno e gli spostamenti aritmetici vengono sempre eseguiti con >> e . L’operatore >>> viene utilizzato per uno spostamento a destra logico, ma è comunque possibile eseguire accidentalmente uno spostamento a destra aritmetico senza un’attenta conversione dei tipi.
Possono sorgere complicazioni anche quando gli operandi hanno lunghezze di bit diverse o quando alcuni sono con segno e altri senza segno. Gli operatori bit a bit e le costanti numeriche all’interno di un’espressione complessa potrebbero non essere valutati come previsto. Occorre prestare attenzione a specificare la dimensione e la natura firmata/non firmata di ciascuna quantità nell’espressione. Questo può essere fatto con un accurato typecasting o assegnazioni intermedie a specifici tipi di variabili nel codice del programma.