Sul PHP documentation su JSON si parla della parola bitmask. Wikipedia ha definito una maschera. Non capisco né maschera di bit o maschera o come sono utili. Qualcuno può spiegare questi termini usando termini di profano e nessun gergo?Che cos'è una maschera di bit e una maschera?
risposta
È solo un numero, come rappresentato in binario. Ad esempio, supponiamo di avere 8 valori booleani (true
o false
) che voglio archiviare. Potrei memorizzarlo come una matrice di 8 booleani, o potrei memorizzarlo come un singolo byte (8 bit), ognuno dei quali memorizza uno dei booleani (0
= false
, 1
= true
).
A questo punto, posso facilmente manipolare il mio byte in modo che sia possibile (1) impostare bit specifici da attivare o disattivare (vero o falso) e (2) controllare se i bit specifici sono accesi o spenti.
- Per impostare un bit a 1:
mask = mask | (1 << bitIndex)
- Per impostare un po 'per 0:
mask = mask & ~(1 << bitIndex)
- Per ottenere un po' (per essere in grado di controllare):
(mask & (1 << bitIndex)) != 0
Tutto queste operazioni utilizzano l'operatore di spostamento a sinistra, che sposta i bit dalle posizioni meno significative a quelle più significative.
Bit e byte
In informatica, numeri sono rappresentati internamente in binario. Ciò significa che, quando si utilizza un tipo intero per una variabile, questo verrà internamente rappresentato come una somma di zero e uno.
Come forse saprai, un singolo bit rappresenta uno 0
o uno 1
. Una concatenazione di otto di questi bit rappresenta un byte, ad es. 00000101
, che è il numero 5. Suppongo che tu sappia come i numeri sono rappresentati in binario, in caso contrario, dai un'occhiata a here.
In PHP un numero è (principalmente) lungo 4 byte. Ciò significa che il tuo numero utilizza effettivamente 32 bit della memoria interna. Ma per ragioni di semplicità, in tutta questa risposta userò numeri a 8 bit.
stati Memorizzazione in bit
Ora immaginate che si desidera creare un programma che contiene uno stato, che si basa su più valori che sono uno (true
) o zero (false
). Si potrebbero memorizzare questi valori in diverse variabili, potrebbero essere booleani o interi. Oppure utilizzare una singola variabile intera e utilizzare ogni bit dei suoi 32 bit interni per rappresentare i diversi true e falses.
Un esempio: 00000101
. Qui il primo bit (lettura da destra a sinistra) è vero, che rappresenta la prima variabile. Il 2 ° è falso, che rappresenta la seconda variabile. Il terzo vero. E così via ...
Questo è un modo molto compatto di memorizzare dati e ha molti usi.
Bit Masking
Qui è dove entra in gioco po mascheramento. Sembra complesso, ma in realtà è molto semplice.
Il mascheramento dei bit consente di utilizzare operazioni che funzionano a livello di bit.
- Modifica bit particolare in un byte (s)
- Verificando valori di bit specifici sono presenti o meno.
Effettivamente applica una maschera ad un valore, in cui nel nostro caso il valore è il nostro stato 00000101
e la maschera è di nuovo un numero binario, che indica i bit di interesse.
Eseguendo operazioni binarie sulla maschera e lo stato poteva ottenere quanto segue:
- L'operatore estrae un sottoinsieme dei bit nello stato
- L'operatore OR fissa un sottoinsieme dei bit nello stato
- l'operatore XOR commuta un sottoinsieme dei bit nello stato
Se si vuole impostare un particolare valore true, potremmo farlo utilizzando l'OR opera tor e la seguente maschera di bit:
Mask: 10000000b
Value: 00000101b
---- OR ---------
Result: 10000101b
Oppure si può selezionare un valore particolare da parte dello Stato, utilizzando l'operatore AND:
Mask: 00000100b
Value: 00000101b
---- AND ---------
Result: 00000100b
vi consiglio di prendere qualche sguardo più in profondità e ottenere familiare con il gergo. Un buon inizio può essere il collegamento this.
Goodluck!
[Questa pagina web (https://www.eskimo.com/~scs/cclass/int/sx4ab.html) potrebbe essere d'aiuto. (Attenzione: si tratta di C, non di PHP, e potrebbe avere un gergo troppo alto: il rapporto di termini di un laico.) –
@SteveSummit leggere molto bene, grazie. – Pochi