我有一个函数接受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位)
有没有其他方法来计算这个位掩码?
很感激帮助。
谢谢。
你的基本代码是正确的,虽然我注意到你没有指定mask
的类型。
如果调用者将大于15的值传递给index
,那么您打算做什么?听起来你必须充分利用糟糕的情况。根据上下文你可以简单地从func
返回,你可以断言,或者你可以继续使用零的mask
。
这让我们回到了mask
类型的问题。我会根据您的环境将其定义为unsigned short
,uint16
或类似物。但除此之外,你的第一次尝试基本上是正确的。这只是一个错误处理的问题。
uint16 shift = index & 15;
uint16 mask = 1 << shift;
你有正确的方法。但是,实现的问题是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;