【问题标题】:Bitmask - Left shift overflow [duplicate]位掩码 - 左移溢出 [重复]
【发布时间】:2018-12-21 09:50:11
【问题描述】:

问题: 我想根据给定的长度生成一个位掩码(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 或类型转换以避免该错误。

【问题讨论】:

    标签: c macros bitmask


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      相关资源
      最近更新 更多