位掩码-左移溢出

时间:2018-12-21 09:50:12

标签: c macros bitmask

问题: 我想基于给定的长度生成位掩码(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来避免该错误。

1 个答案:

答案 0 :(得分:0)

差不多了,但是您需要将文字1更改为1UL。否则,您将被限制在int的范围内,该范围可能是31位而不是32位。

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

n的范围必须在0到31之间,以适合uint32_t。为了防止溢出,可以将其设置为(n)%32,尽管如果n是运行时值而不是整数常量,则会使宏变慢。