Visualizzazione risultati 1 fino 6 di 6

Discussione: Operatori sui bit

  1. #1
    Guest

    Predefinito Operatori sui bit

    Ciao utenti,
    oggi mi sono venuti in mente gli operatori logici & | ! per lavorare sui bit.
    In particolare mi è caèitata tra le mani questa funzione:
    Codice PHP:
    function getPerms($f) {
    //By blacklight, edit by me
    $mode = fileperms($f);
    $perm = '';
    $perm .= ($mode & 00400) ? 'r' : '-';
    $perm .= ($mode & 00200) ? 'w' : '-';
    $perm .= ($mode & 00100) ? 'x' : '-';
    $perm .= ($mode & 00040) ? 'r' : '-';
    $perm .= ($mode & 00020) ? 'w' : '-';
    $perm .= ($mode & 00010) ? 'x' : '-';
    $perm .= ($mode & 00004) ? 'r' : '-';
    $perm .= ($mode & 00002) ? 'w' : '-';
    $perm .= ($mode & 00001) ? 'x' : '-';
    return (
    is_dir($f)) ? "d".$perm : $perm;
    }
    Serve per avere i permessi di un file.
    Come vedete compare l'operatore &.
    A cosa serve? E cosa sono quei numeri?
    Grazie mille

  2. #2
    Guest

    Predefinito

    Se c'è $mode e c'è quel numero allora (?) ...sennò (:)...
    Tradotto:
    Codice PHP:
    if($mode && $perm == "numero") { $perm = "x"; } else { $perm = "-"; }
    Credo sia così!
    Ultima modifica di sIM : 18-04-2009 alle ore 14.40.51

  3. #3
    Guest

    Predefinito

    Si, è un operatore ternario, però credo che abbia una precedenza/importanza minore, è come fare
    Codice PHP:
    $var = ($var2 == $va3) ? '' : '';
    e
    Codice PHP:
    $var = ($var2 === $va3) ? '' : '';

  4. #4
    Guest

    Predefinito

    No, mi sono espresso male.
    C'è differenza tra && e &, e vorrei sapere qual'è.
    Il ternario so cos'è, utilissimo tra l'altro per snellire il codice

  5. #5
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    Citazione Originalmente inviato da gabryhacker Visualizza messaggio
    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.
    Ultima modifica di dreadnaut : 18-04-2009 alle ore 20.36.52

  6. #6
    Guest

    Predefinito

    Grazie per l'esauriente spiegazione

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •