c - 位掩码 - 左移溢出
问题描述
问题: 我想根据给定的长度生成一个位掩码(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
为1UL
. 否则,您将被限制在 的范围内int
,这可能是 31 位而不是 32 位。
#define BIT_MASK32(n) ( (1UL<<(n)) - 1UL )
Wheren
必须在 0 到 31 的范围内才能适合 a uint32_t
。为了防止溢出,您可以 make it ,但如果是运行时值而不是整数常量(n)%32
,这会使宏变慢。n
推荐阅读
- python - csv 到 json,json.decoder.JSONDecodeError:期望值:第 1 行第 1 列(字符 0)
- xcode - 选项卡视图控制器窗口大小卡住
- python - 树莓派 V4 PYTON,MYSQL,断开与外部互联网的连接
- matlab - 我需要使用 matlab 证明下面给出的 E[aX+b], var[aX+b]
- react-native - 无效的挂钩调用。Hooks 只能在函数组件的主体内部调用,在进行函数调用时出现此错误
- javascript - React-native flatlist 在 isLoading 上的组件之间共享道具
- python - 对函数的什么调用将导致以下输出?
- python - 在pyparsing中抑制空字符串
- regex - emacs:使用(字符串匹配)在字符串中查找子字符串
- facebook - 如果在 Facebook 应用程序中打开,Facebook 登录会陷入循环