di: Ermanno Ancona 10 Febbraio 2005
Per questa operazione ricorriamo all'operatore XOR (OR esclusivo): (numero1 ^ numero2). Nel confronto bit a bit questo operatore fornisce 1 solo se uno dei due bit è impostato a 1 e l'altro a 0. Negli altri casi produce 0. Se nel numero 5, 00000101, vogliamo invertire il bit di posizione uno dovremo eseguire un XOR con 00000010, ovvero il decimale 2.
Infatti 5 ^ 2 = 7, vediamo l'operazione binaria:
| 5 | -> | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | XOR |
| 2 | -> | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | = |
| 7 | -> | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
Continuando con l'esempio per invertire la scelta corrispondente al tennis, ovvero impostare la preferenza se non lo è o toglierla se è impostata, procediamo così:
<?php
$user_prefs ^= $choice['tennis'];
?>
La seguente tabella riassume le operazioni sopra descritte:
| impostare una preferenza | $user_prefs |= $valore |
| eliminare una preferenza | $user_prefs &= ~$valore |
| invertire una preferenza | $user_prefs ^= $valore |
| verificare una preferenza | $user_prefs & $valore |
Il semplice esempio sulla base del quale si è sviluppato l'articolo, ha permesso di introdurre quelli che in PHP sono conosciuti come bitwise operators potete trovare la documentazione ufficiale all'indirizzo http://www.php.net/manual/en/language.operators.bitwise.php. Per brevità non sono stati trattati gli operatori di shift destro e sinistro.
Vi invito a fare attenzione alle relazioni di precedenza tra operatori: gli operatori binari vengono applicati dopo gli operatori aritmetici e di comparazione. Questo può indurre in errore, ad esempio if(4 & 5 ! = 0) anziché verificare positivamente che il bit di posizione due vale 1 nel numero 5, prima verifica che 5 sia diverso da zero il ché è vero (ed equivale a 1), poi calcola 4 & 1 = 0. In caso di dubbio è sempre meglio ricorrere alle parentesi: if( (4 & 5) ! = 0). Per maggiori informazioni http://www.php.net/manual/en/language.operators.php#language.operators.precedence.
In chiusura vorrei accennare al fatto che questa tecnica talora viene utilizzata per gestire in maniera sofisticata i permessi di accesso ad un'area riservata, un esempio lo trovate nell'articolo Gestire gli utenti con PHP: i permessi di Gabriele Farina. Infatti è possibile far sí che un livello di privilegio erediti i permessi di un altro. Brevemente si consideri la situazione seguente:
| capo reparto: | 00000111 | -> 7 |
| collaudatore: | 00000010 | -> 2 |
| meccanico: | 00000001 | -> 1 |
Come si vede meccanico e collaudatore hanno permessi distinti mentre il capo reparto eredita automaticamente i permessi di entrambi avendo i corrispondenti bit di posizione zero e uno impostati a 1. Se un meccanico tenta di accedere ad un'area in cui vengono richiesti i permessi di collaudatore, valore 2, verrà bloccato infatti 1 & 2 = 0. Al contrario un capo reparto no, infatti 7 & 2 = 2 che è il valore richiesto. Come si può notare le applicazioni possono essere varie sta' a voi trovarne di nuove.
Guida Yii FrameworkCome creare applicazioni Web in modo semplice e veloce con il... |
Guida Zend FrameworkDiventate professionisti dello sviluppo Web. Zend Framework è lo... |
Guida Applicazioni Facebook con PHPCome realizzare un'applicazione per Facebook. Dalle basi della... |
Ogni lunedì, direttamente nella tua e-mail: script, articoli, guide e tutorial su PHP, MySQL e Apache.
Iscriviti alla newsletter
|
|
Corso PHP per Webmaster11 Giugno 2012 a Milano |
|
|
Corso Google AdWords Base25 Giugno 2012 a Milano |
|
|
Corso Google AdWords Base05 Giugno 2012 a Roma |