Can someone please explain this function to me?
A mask with the least significant n bits set to 1.
Ex:
n = 6 --> 0x2F, n = 17 --> 0x1FFFF // I don\'t ge
A mask is a common term for an integer value that is bit-wise ANDed, ORed, XORed, etc with another integer value.
For example, if you want to extract the 8 least significant digits of an int variable, you do variable & 0xFF
. 0xFF is a mask.
Likewise if you want to set bits 0 and 8, you do variable | 0x101
, where 0x101 is a mask.
Or if you want to invert the same bits, you do variable ^ 0x101
, where 0x101 is a mask.
To generate a mask for your case you should exploit the simple mathematical fact that if you add 1 to your mask (the mask having all its least significant bits set to 1 and the rest to 0), you get a value that is a power of 2.
So, if you generate the closest power of 2, then you can subtract 1 from it to get the mask.
Positive powers of 2 are easily generated with the left shift <<
operator in C.
Hence, 1 << n
yields 2n. In binary it's 10...0 with n
0s.
(1 << n) - 1
will produce a mask with n
lowest bits set to 1.
Now, you need to watch out for overflows in left shifts. In C (and in C++) you can't legally shift a variable left by as many bit positions as the variable has, so if ints are 32-bit, 1<<32
results in undefined behavior
. Signed integer overflows should also be avoided, so you should use unsigned values, e.g. 1u << 31
.