Originalmente inviato da
gabryhacker
Ciao utenti,
oggi mi sono venuti in mente gli operatori logici & | ! per lavorare sui bit.
[...]
Come vedete compare l'operatore &.
A cosa serve? E cosa sono quei numeri?
gli operatori bit a bit sono fatti per lavorare su singole cifre binarie di numeri interi, invece che su variabili con un singolo valore vero/false. Esistono anche in altri linguaggi, ed in php funzionano allo stesso modo.
Immagina un numero intero ad 8 bit. Questo può avere decimali valori da 0 a 255, ma in binario appare come 8 cifre, e.g. 17 = 16 + 1 = 2^4 + 2^0 = 00010001. Gli operatori bit a bit confrontano una cifra binaria per volta, e ritornano un risultato per ciascuna di essere, nella stessa posizione.
Calcoliamo 17 & 16, cioè
Codice:
17 - 0 0 0 1 0 0 0 1
& & & & & & & &
16 - 0 0 0 1 0 0 0 0
= = = = = = = =
0 0 0 1 0 0 0 0
quindi il risultato è 16. In php i numeri interi hanno molti più bit, ma il concetto è lo stesso.
Per quanto riguarda i permessi, essi sono memorizzati in un paio di byte per risparmiare spazio, mettendo ad "1" particolari valori, quando il permesso è presente:
Codice:
r w x r w x r w x ... etc, altra roba
1 1 0 1 0 0 1 0 0
Per comodità, si guardano i permessi in ottale, perché in base 8 si usano esattamente tre bit, come i permessi - quello nell'esempio sopra è quindi 4+2, 4 , 4, ovvero permessi 644.
I numeri ottali in php si scrivono con uno zero davanti, quindi 0644, e per "l'altra roba che è memorizzata negli stessi byte, ci sono degli altri bit davanti, quindi 00644.
E qui torniamo alla tua funzione: questa legge i permessi di un file e li mette in "and" (&) con una serie di "maschere binarie", date dai valori dei permessi. Esempio:
Codice:
00644 - 0 0 0 1 1 0 1 0 0 1 0 0
00400 - 0 0 0 1 0 0 0 0 0 0 0 0
& & & & & & & & & & & &
0 0 0 1 0 0 0 0 0 0 0 0
Il risultato è di nuovo 00400, e quando questo viene valutato come condizione dell'if ternario è diverso da zero, quindi true. L'esecuzione si più spiegare come "se i permessi hanno questo particolare bit attivo, scrivi la lettera a schermo".
Con gli operatori bit a bit, questi simboli un po' dimenticati, implementi facilmente queste "maschere", come dei fogli di carta con dei buchi che fanno vedere solo alcune lettere sotto. Con & separi singoli valori, con | metti assieme più valori ( e.g. 00644 | 00111 = 00755 ), con lo xor (^) ed una maschera inverti il valore di specifici bit, etc.