问题: 我想基于给定的长度生成位掩码(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来避免该错误。
答案 0 :(得分:0)
差不多了,但是您需要将文字1
更改为1UL
。否则,您将被限制在int
的范围内,该范围可能是31位而不是32位。
#define BIT_MASK32(n) ( (1UL<<(n)) - 1UL )
n
的范围必须在0到31之间,以适合uint32_t
。为了防止溢出,可以将其设置为(n)%32
,尽管如果n
是运行时值而不是整数常量,则会使宏变慢。