在16位架构中根据给定索引计算位掩码

时间:2018-09-07 19:06:38

标签: c bitmask 16-bit

我有一个函数可以接受unsigned long类型的索引变量(此类型不能更改)。

void func(unsigned long index);

我需要将其转换为位掩码,以使索引0的位掩码为1,索引1的位掩码为2,为2则为4,依此类推。

我已经执行以下操作:

mask = 1 << index;

问题是我正在使用16位体系结构,因此无符号长变量显示为32位,从而弄乱了该变量。 (最低的16位为我提供了正确的mask值,但最高的16位会添加额外的信息,这会弄乱这一点。)

即而不是:mask = 0000000000000001(16位)

我正在获取:xxxxxxxxxxxxxxxx0000000000000001(32位)

还有另一种方法来计算此位掩码吗?

不胜感激。

谢谢。

2 个答案:

答案 0 :(得分:4)

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

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

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

uint32_t mask = UINT32_C(1) << index;

答案 1 :(得分:1)

您的基本代码是正确的,尽管我注意到您没有指定mask的类型。

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

这使我们回到mask类型的问题。我会根据您的环境将其定义为unsigned shortuint16或类似名称。但是除此之外,您的第一次尝试基本上是正确的。这只是错误处理的问题。

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