Questo tipo di operatore è sicuramente risultato fondamentale per chiunque abbia mai lavorato a stretto contatto con l’hardware. Grazie a questi operatori possiamo infatti manipolare i bit di cui sono composti i numeri in varie maniere.

Da notare che in PHP anche le stringhe sono affette da questi operatori. Anche in questo caso si tratta di operatori binari.

Oltre ai blasonati and, or e not sono presenti anche degli operatori di shift a destra e shift a sinistra e l’operatore xor.

Sono incredibilmente utili quando si ha bisogno di fare del masking oppure se si è interessati a fare dei giochini matematici come ad esempio scambiare due variabili senza usarne una terza.

<?php
 
$a = 2;
$b = 4;
 
/* Operatori Bitwise */
 
$x = $a << $b; // Shift left "<<"
echo "$x\n";   // 32
 
$x = $a >> $b; // Shift right ">>"
echo "$x\n";   // 0
 
$x = $a & $b;  // And "&"
echo "$x\n";   // 0
 
$x = $a | $b;  // Or "|"
echo "$x\n";   // 6
 
$x = ~$a;      // Not "~"
echo "$x\n";   // -3
 
$x = $a ^ $b;  // Xor "^"
echo "$x\n";   // 6
 
?>

Per chi è un po a digiuno di assembly oppure non lo ha mai fatto gli operatori bitwise possono risultare non immediati cosi ora cercherò di spiegare brevemente come lavorano.

Dobbiamo dire prima di tutto che questi operatori operano sui singoli bit che compongono un numero fregandosene bellamente che esso sia un carattere, un float o un intero.

Incominciamo con il piú semplice. L’operatore Not.
Questo operatore prende un bit e lo fa diventare il suo opposto quindi gli uno diventano zero e viceversa.

L’operatore Or esegue una somma sui singoli bit cosi ogni volta che in $a o in $b è presente un bit a 1 l’operatore ritorna 1.

L’And invece ritorna 1 se e solo se in entrambi gli operandi il bit è a 1.

Lo Xor o Excluve Or è un operatore davvero singolare in quanto ritorna 1 quando i bit dei due operandi sono diversi e 0 quando sono uguali.

Gli operatori di shift sono piuttosto semplici visto che l’unica operazione che compiono è introdurre un determinato numero di zeri o da destra o da sinistra spostando di conseguenza tutto il contenuto della variabile in una direzione o nell’altra.

<?php
 
$a = 1432;  // bit: 0000 0101 1001 1000
$b = 131;   // bit: 0000 0000 1000 0011
 
// Or
echo $a | $b,"\n"; // 1435:  bit: 0000 0101 1001 1011
 
// and
echo $a & $b,"\n"; // 128:   bit: 0000 0000 1000 0000
 
// not
echo ~$a,"\n";     // -1433: bit: 1111 1010 0110 0111
 
// xor
echo $a ^ $b,"\n"; // 1307:  bit: 0000 0101 0001 1011
 
// shift left di 2
echo $a << 2,"\n"; // 5728:  bit: 0001 0110 0110 0000
 
?>

Volevo far notare una cosa molto interessante nell’ultima riga quella con l’operatore di shift. Forse alcuni si saranno gia accorti che ogni volta che introduciamo uno zero da destra il numero viene moltiplicato per due. Nel nostro caso introducendo 2 zeri abbiamo moltiplicato l’argomento per 4.

Lascio a voi scoprire cosa succede quando si introducono degli zeri da sinistra 😉

vicius