How to create mask with least significat bits set to 1 in C

前端 未结 6 1937
隐瞒了意图╮
隐瞒了意图╮ 2021-02-13 06:42

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

6条回答
  •  野的像风
    2021-02-13 06:59

    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.

提交回复
热议问题