Una máscara es un término común para un valor entero que se basa en bits AND, ORed, XORed, etc. con otro valor entero.
Por ejemplo, si desea extraer los 8 dígitos menos significativos de una variable int, haga variable & 0xFF
. 0xFF es una máscara.
Del mismo modo, si desea establecer los bits 0 y 8, haga variable | 0x101
, donde 0x101 es una máscara.
O si desea invertir los mismos bits, lo hace variable^0x101
, donde 0x101 es una máscara.
Para generar una máscara para su caso, debe aprovechar el simple hecho matemático de que si agrega 1 a su máscara (la máscara tiene todos sus bits menos significativos configurados en 1 y el resto en 0), obtiene un valor que es una potencia de 2.
Por lo tanto, si genera la potencia más cercana a 2, puede restar 1 de ella para obtener la máscara.
poderes positivos de la 2 se generan fácilmente con la izquierda operador de desplazamiento <<
en C.
Por lo tanto, 1 << n
rendimientos 2 n. En binario es 10 ... 0 con n
0s.
(1 << n) - 1
producirá una máscara con n
bits más bajos fijados a 1.
Ahora, es necesario tener cuidado con los desbordamientos en desplazamientos a la izquierda. En C (y en C++) legalmente no se puede desplazar una variable a la izquierda en tantas posiciones de bits como la variable, por lo que si las entradas son de 32 bits, 1<<32
da como resultado undefined behavior
. Los desbordamientos de enteros firmados también deben evitarse, por lo que debe usar valores sin signo, p. 1u << 31
.
* también lo que es una máscara * [¿Qué hay de Wikipedia?] (Http://en.wikipedia.org/wiki/Mask_? (informática)) – chris
El 0x2F está equivocado por cierto, debe ser 0x3f – wich
@chris wiki es demasiado confusión ... – sebi