首页 > 解决方案 > 位掩码 - 左移溢出

问题描述

问题: 我想根据给定的长度生成一个位掩码(uint32_t)。应达到以下结果:

BIT_MASK(3) =  0x00..0111 
BIT_MASK(32) = 0x111..111 

下面给出的代码适用于小于 32 的每个长度。如果长度为 32,则左移计数大于类型宽度(溢出)。

#define BIT(n)                  ( 1<<(n) )
#define BIT_MASK(len)           ( BIT(len)-1 )

uint32_t length;
uint32_t mask = BIT_MASK(length);

问题: 是否有任何其他有效的宏解决方案来生成位掩码,它不包括额外的 if/else 或 typecast 以避免该错误。

标签: cmacrosbitmask

解决方案


差不多就是这样,但是您需要将文字更改11UL. 否则,您将被限制在 的范围内int,这可能是 31 位而不是 32 位。

#define BIT_MASK32(n) ( (1UL<<(n)) - 1UL )

Wheren必须在 0 到 31 的范围内才能适合 a uint32_t。为了防止溢出,您可以 make it ,但如果是运行时值而不是整数常量(n)%32,这会使宏变慢。n


推荐阅读