从 16 位架构中的给定索引计算位掩码

Calculate bitmask from a given index in a 16 bit architecture

我有一个函数接受 unsigned long 类型的索引变量(此类型无法更改)。

void func(unsigned long index);

我需要将其转换为位掩码,对于索引 0,位掩码将为 1,对于索引 1,位掩码将为 2,对于 2,它将为 4,依此类推。

我做了以下事情:

mask = 1 << index;

问题是我正在使用 16 位的体系结构,因此无符号长变量显示为 32 位,这弄乱了这个变量。 (最低的 16 位为我提供了正确的掩码值,但最高的 16 位添加了额外的信息,这让一切变得混乱)。

即而不是得到:掩码= 0000000000000001(16位)

我得到:xxxxxxxxxxxxxxxx0000000000000001(32 位)

还有其他方法可以计算这个位掩码吗?

希望得到帮助。

谢谢。

你的做法是正确的。但是,您的实现的问题是 1 << index 表达式中 1 的类型是 int,具有实现定义的表示形式。由于您正在寻找 unsigned long 结果,请改用 ((unsigned long)1)

unsigned long mask = ((unsigned long)1) << index;

如果您的平台支持 stdint.h 并且您需要某个特定宽度的遮罩,请改用 uint32_t

uint32_t mask = UINT32_C(1) << index;

你的基本代码是正确的,虽然我注意到你没有指定 mask 的类型。

如果调用者将大于 15 的值传递给 index,你打算怎么办?听起来你必须充分利用糟糕的情况。根据上下文,您可以简单地从 func return,您可以断言,或者您可以继续 mask 为零。

这让我们回到mask类型的问题。我会将其定义为 unsigned shortuint16 或类似的,具体取决于您的环境。但除此之外,你的第一次尝试基本上是正确的。只是错误处理的问题。

uint16 shift = index & 15;
uint16 mask = 1 << shift;