Gli operatori sui bit permettono di manipolare i singoli bit
di un tipo di dato primitivo, eseguendo operazioni di algebra booleana
sui bit corrispondenti dei due argomenti.
Innanzitutto dobbiamo ricordarci che tutte le informazioni circolano,
allinterno di sistemi digitali come il computer, sotto forma
di valori 0 (zero) e 1 (uno): ogni oggetto del linguaggio, sia esso
un tipo di dato primitivo o listanza di una classe, è rappresentato
allinterno del computer mediante opportune combinazioni di
queste due cifre, dette bit (binary Digit).
Per operare con le cifre binarie 0 e 1 ci si avvale della cosiddetta
Algebra di Boole, che fornisce un insieme di regole con le quali è possibile
combinare queste cifre per effettuare operazioni aritmetiche elementari.
Le operazioni più complesse e le cosiddette funzioni booleane possono
essere realizzate per mezzo di appropriate sequenze di queste operazioni
elementari.
Loperatore binario AND (&) produce un 1 se
entrambi gli operandi sono 1, 0 altrimenti:
|
OPERATORE AND BINARIO
|
||
|
Operando 1
|
Operando 2
|
Risultato
|
|
0 |
0 |
0 |
|
0 |
1 |
0 |
|
1 |
0 |
0 |
|
1 |
1 |
1 |
Loperatore binario OR (|) produce un 1 se almeno
uno degli operandi è 1, 0 altrimenti:
|
OPERATORE OR BINARIO
|
||
|
Operando 1
|
Operando 2
|
Risultato
|
|
0 |
0 |
0 |
|
0 |
1 |
1 |
|
1 |
0 |
1 |
|
1 |
1 |
1 |
Loperatore binario OR esclusivo (^),
brevemente indicato come XOR, produce un 1 se gli operandi
hanno valori diversi, 0 se hanno lo stesso valore:
|
OPERATORE XOR BINARIO
|
||
|
Operando 1
|
Operando 2
|
Risultato
|
|
0 |
0 |
0 |
|
0 |
1 |
1 |
|
1 |
0 |
1 |
|
1 |
1 |
0 |
Loperatore logico NOT (~), chiamato anche complemento
a uno, è un operatore unario (opera cioè con un solo operando)
e produce il valore opposto del suo operando:
|
OPERATORE NOT
|
|
|
Operando
|
Risultato
|
|
0 |
1 |
|
1 |
0 |
Gli operatori binari utilizzano gli stessi caratteri dei corrispondenti
operatori logici, cosicché è più facile avere un metodo mnemonico
per ricordarne lutilizzo e il significato.
Anche gli operatori binari possono essere combinati col segno =
per istruzioni di assegnamento abbreviate: &=, |= e ^= sono
forme permesse.
Naturalmente, poiché ~ è un operatore unario, non può essere combinato
con il segno =.
Il tipo booleano è trattato come un valore ad un bit, con una
differenza: è possibile eseguire operazioni binarie di tipo AND,
OR e XOR, ma non si può eseguire il NOT binario (probabilmente per
evitare confusione con il NOT logico).
Per i booleani gli operatori binari hanno lo stesso effetto degli
operatori logici, eccezion fatta per leffetto short
circuiting (a tal proposito rivedete la lezione precedente).
Vediamo un esempio di applicazione di AND binario a due interi,
12 e 15:
12 & 15
il risultato che si ottiene è 12.
Nonostante lapparente stranezza del risultato, la spiegazione
è molto semplice: la rappresentazione binaria di 12 è 1100, mentre
la rappresentazione binaria di 15 è 1111.
Loperatore AND esegue land logico bit a bit tra le due
stringhe, cosicché, se mettiamo in colonna le due rappresentazioni
binarie ed eseguiamo loperazione, otterremo:
1100
& 1111
----
1100
che è ancora la rappresentazione binaria del numero 12.
Un altro tipo di operazione che si può effettuare sui bit è lo
shift, ossia lo slittamento delle cifre binarie di un certo numero di posizioni
verso destra o verso sinistra.
In Java esistono 3 operatori di shift:
|
OPERATORE |
USO |
|
>> |
op1 >> op2 |
|
<< |
op1 << op2 |
|
>>> |
op1 >>> op2 |
Questi operatori possono essere utilizzati solo con i tipi primitivi.
Loperatore >> sposta verso destra le cifre delloperando
op1 di un numero di bit pari al valore specificato da op2, inserendo,
al posto dei bit di ordine più alto, degli zero se op2 è positivo o degli uno se op2 è negativo.
Questa caratteristica è detta estensione in segno e non
è utilizzata dalloperatore >>>, che ha la stessa
funzione del precedente (cioè spostare verso destra i bit di op1
secondo il valore di op2), ma che inserisce sempre al posto dei bit più segnificativi degli zero,
qualsiasi sia il segno di op2.
Ad es.:
13 >> 1
sposta i bit che rappresentano il numero 13 (1101) verso destra
e aggiunge un 1 nella cifra più significativa, originando il valore
6 (0110).
Loperatore << sposta verso sinistra le cifre delloperando
op1 di un numero di bit pari al valore specificato da op2, inserendo
degli zero al posto dei bit di ordine più basso.
Se questi operatori sono appplicati a variabili di tipo char,
byte o short, esse vengono automaticamente convertite in int prima delloperazione
di shift, e il risultato prodotto è di tipo int.
Al fine di prevenire abusi nel numero di posizioni di cui viene
shiftato un int, vengono presi in considerazione solo i
5 bit di ordine più basso di op2.
Se si opera con una variabile di tipo long, il risultato
dello shift è ancora un long, ma vengono considerati solo
gli ultimi 6 bit di op2.
Anche per gli operatori di shift esistono delle istruzioni di assegnamento
abbreviate: >>=, <<=, >>>=.
Torna all'indice Generale del corso di Corso di Java di Software Planet