PHP  »  Articoli  »  Programmazione Php 

Utilizzare le operazioni sui bit di PHP per ottimizzare il database

di: Ermanno Ancona     10 Febbraio 2005

Invertire un bit

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->00000101XOR
2->00000010=
7->00000111

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'];
?>

Schema riassuntivo

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

Conclusioni

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.

Guide PHP

Guida Yii Framework

Come creare applicazioni Web in modo semplice e veloce con il...

Guida Zend Framework

Diventate professionisti dello sviluppo Web. Zend Framework è lo...

Guida Applicazioni Facebook con PHP

Come realizzare un'applicazione per Facebook. Dalle basi della...

Altre guide

Newsletter @PHP

Ogni lunedì, direttamente nella tua e-mail: script, articoli, guide e tutorial su PHP, MySQL e Apache.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Corso PHP per Webmaster

11 Giugno 2012 a Milano
Disponibilità: 7 Posti

Corso Google AdWords Base

25 Giugno 2012 a Milano
Disponibilità: 7 Posti

Corso Google AdWords Base

05 Giugno 2012 a Roma
Disponibilità: 7 Posti