2015-07-22 12 views
14

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?

+1

[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.) –

+0

@SteveSummit leggere molto bene, grazie. – Pochi

risposta

8

È 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.

43

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!

Problemi correlati