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

问题描述 投票:1回答:2

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

void func(unsigned long index);

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

我做了以下事情:

mask = 1 << index;

问题是我正在使用16位架构,因此无符号长变量显示为32位,这会混淆这个变量。 (最低的16位为我提供了正确的掩码值,但是最高的16位增加了额外的信息,这使得它更加混乱)。

即取代:mask = 0000000000000001(16 bit)

我得到:xxxxxxxxxxxxxxxx0000000000000001(32位)

有没有其他方法来计算这个位掩码?

很感激帮助。

谢谢。

c bitmask 16-bit
2个回答
1
投票

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

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

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

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

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;
© www.soinside.com 2019 - 2024. All rights reserved.