significado sentido mascara figurado crear bitmask

bitmask - sentido - ¿Qué es una máscara de bits y una máscara?



mascara significado (3)

En esencia, la máscara de bits es una lista de indicadores booleanos (por ejemplo isAlive, isMoving, etc.) comprimidos en un solo campo, generalmente un entero. Puede reducir una cantidad significativa de tamaño de cadena JSON o huella de memoria.

Esto puede ser significativo, especialmente en PHP, donde un único booleano en una matriz puede tomar la misma cantidad de RAM que un entero. Hay una guía de máscara de bits muy simple que le explicará paso a paso todo lo que necesita saber, incluido cómo y cuándo usarlo.

En la documentation PHP sobre JSON, menciona la palabra máscara de bits. Wikipedia lo tiene definido como una máscara. No entiendo ni la máscara de bits ni la máscara, ni por qué son útiles. ¿Alguien puede explicar estos términos usando términos simples y sin jerga?


Es solo un número, como se representa en binario. Por ejemplo, digamos que tengo 8 valores booleanos ( true o false ) que quiero almacenar. Podría almacenarlo como una matriz de 8 booleanos, o podría almacenarlo como un solo byte (8 bits), cada uno de los cuales almacena uno de los booleanos ( 0 = false , 1 = true ).

En este punto, puedo manipular fácilmente mi byte para que pueda (1) activar o desactivar los bits específicos (verdadero o falso), y (2) verificar si los bits específicos están activados o desactivados.

  • Para establecer un bit a 1: mask = mask | (1 << bitIndex) mask = mask | (1 << bitIndex)
  • Para establecer un bit en 0: mask = mask & ~(1 << bitIndex)
  • Para obtener un bit (para poder comprobarlo): (mask & (1 << bitIndex)) != 0

Todas estas operaciones utilizan el operador de desplazamiento a la izquierda, que mueve los bits hacia arriba desde las posiciones menos significativas a las más significativas.


Bits y Bytes

En computación, los números están representados internamente en binario. Esto significa que, cuando utilice un tipo de entero para una variable, esto en realidad se representará internamente como una suma de ceros y unos.

Como sabrás, un solo bit representa un 0 o un 1 . Una concatenación de ocho de esos bits representa un byte, por ejemplo, 00000101 , que es el número 5. Supongo que sabe cómo se representan los números en binario; si no, mire here .

En PHP un número es (en su mayoría) 4 bytes de longitud. Esto significa que su número realmente usa 32 bits del almacenamiento interno. Pero por razones de simplicidad, a lo largo de esta respuesta usaré números de 8 bits.

Almacenando estados en bits

Ahora imagine que desea crear un programa que contenga un estado, que se base en varios valores que son uno ( true ) o cero ( false ). Uno podría almacenar estos valores en diferentes variables, ya sean booleanos o enteros. O en su lugar, use una sola variable de entero y use cada bit de sus 32 bits internos para representar los diferentes valores verdaderos y falsos.

Un ejemplo: 00000101 . Aquí el primer bit (leyendo de derecha a izquierda) es verdadero, lo que representa la primera variable. El segundo es falso, que representa la segunda variable. La tercera verdad. Y así...

Esta es una forma muy compacta de almacenar datos y tiene muchos usos.

Enmascaramiento de bits

Aquí es donde entra la máscara de bits. Suena complejo pero en realidad es muy simple.

El enmascaramiento de bits le permite utilizar operaciones que funcionan en el nivel de bits.

  • Editar bits particulares en un (s) byte (s)
  • Comprobando si los valores de bit particulares están presentes o no.

En realidad, aplica una máscara a un valor, donde en nuestro caso el valor es nuestro estado 00000101 y la máscara es nuevamente un número binario, que indica los bits de interés.

Al realizar operaciones binarias en la máscara y el estado se podría lograr lo siguiente:

  • El operador AND extrae un subconjunto de los bits en el estado
  • El operador OR establece un subconjunto de los bits en el estado
  • El operador XOR alterna un subconjunto de los bits en el estado

Si queremos establecer un valor particular en verdadero, podríamos hacerlo usando el operador OR y la siguiente máscara de bits:

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

O uno podría seleccionar un valor particular del estado utilizando el operador AND:

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

Te sugiero que eches un vistazo más a fondo y te familiarices con la jerga. Un buen comienzo puede ser this enlace.

¡Buena suerte!