web-dev-qa-db-fra.com

Qu'est-ce qu'un bitmask et un masque?

Sur le PHP documentation à propos de JSON, il mentionne le masque de bits Word. Wikipedia l'a défini comme un masque. Je ne comprends ni le masque de bits ni le masque ni leur utilité) Quelqu'un peut-il expliquer ces termes en utilisant des termes simples et sans jargon?

31
Robert Rocha

Bits et octets

En informatique, les nombres sont représentés en interne en binaire. Cela signifie que lorsque vous utilisez un type entier pour une variable, ce sera en fait en interne sera représenté comme une somme de zéros et de uns.

Comme vous le savez peut-être, un seul bit représente un 0 ou une 1. Une concaténation de huit de ces bits représente un octet, par ex. 00000101, qui est le nombre 5. Je suppose que vous savez comment les nombres sont représentés en binaire, sinon, jetez un oeil ici .

En PHP un nombre est (principalement) de 4 octets. Cela signifie que votre numéro utilise en fait 32 bits de la mémoire interne. Mais pour des raisons de simplicité, tout au long de cette réponse, j'utiliserai des nombres de 8 bits.

Stockage des états en bits

Imaginez maintenant que vous souhaitez créer un programme qui contient un état, qui est basé sur plusieurs valeurs qui sont une (true) ou zéro (false). On pourrait stocker ces valeurs dans différentes variables, qu'elles soient booléennes ou entières. Ou à la place utilisez une seule variable entière et utilisez chaque bit de ses 32 bits internes pour représenter les différents vrais et faux.

Un exemple: 00000101. Ici, le premier bit (lecture de droite à gauche) est vrai, ce qui représente la première variable. La 2e est fausse, ce qui représente la 2e variable. Le troisième vrai. Etc...

Il s'agit d'une manière très compacte de stocker des données et a de nombreux usages.

Masquage des bits

C'est là que le masquage des bits entre en jeu. Cela semble complexe mais en fait c'est très simple.

Le masquage des bits vous permet d'utiliser des opérations qui fonctionnent au niveau des bits.

  • Modification de bits particuliers dans un ou des octets
  • Vérifier si des valeurs de bits particulières sont présentes ou non.

Vous appliquez en fait un masque à une valeur, où dans notre cas, la valeur est notre état 00000101 et le masque est à nouveau un nombre binaire, qui indique les bits d'intérêt.

En effectuant des opérations binaires sur le masque et l'état, on pourrait obtenir les résultats suivants:

  • L'opérateur ET extrait un sous-ensemble des bits de l'état
  • L'opérateur OR définit un sous-ensemble des bits dans l'état
  • L'opérateur XOR bascule un sous-ensemble des bits dans l'état

Si nous voulons définir une valeur particulière sur true, nous pouvons le faire en utilisant l'opérateur OR et le masque de bits suivant:

Mask:   10000000b
Value:  00000101b
---- OR ---------
Result: 10000101b

Ou on pourrait sélectionner une valeur particulière de l'état en utilisant l'opérateur AND:

Mask:   00000100b
Value:  00000101b
---- AND ---------
Result: 00000100b

Je vous suggère de l'examiner plus en profondeur et de vous familiariser avec le jargon. Un bon début peut être this link.

Bonne chance!

68
DJanssens

C'est juste un nombre, comme représenté en binaire. Par exemple, disons que j'ai 8 valeurs booléennes (true ou false) que je veux stocker. Je pourrais le stocker dans un tableau de 8 booléens, ou je pourrais le stocker sous la forme d'un seul octet (8 bits), chacun d'entre eux stockant l'un des booléens (0 = false, 1 = true).

À ce stade, je peux facilement manipuler mon octet afin de pouvoir (1) définir des bits spécifiques pour qu'ils soient activés ou désactivés (vrai ou faux), et (2) vérifier si des bits spécifiques sont activés ou désactivés.

  • Pour mettre un bit à 1: mask = mask | (1 << bitIndex)
  • Pour mettre un bit à 0: mask = mask & ~(1 << bitIndex)
  • Pour en obtenir un peu (pour pouvoir le vérifier): (mask & (1 << bitIndex)) != 0

Toutes ces opérations utilisent l'opérateur de décalage à gauche, qui déplace les bits des positions les moins significatives aux positions les plus significatives.

13
Jashaszun

En substance, Bitmask est une liste de drapeaux booléens (par exemple isAlive, isMoving, etc.) compressés en un seul champ, généralement un entier. Il peut réduire une quantité assez importante de taille de chaîne JSON ou d'empreinte mémoire.

Cela peut être significatif en particulier dans PHP où un seul booléen dans un tableau peut prendre la même quantité de RAM comme un entier. Il y a un guide Bitmask très simple qui expliquera étape par étape tout ce que vous devez savoir, y compris comment et quand l'utiliser.

4
Astrus