我有一个函数可以接受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位)
还有另一种方法来计算此位掩码吗?
不胜感激。
谢谢。
答案 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 short
,uint16
或类似名称。但是除此之外,您的第一次尝试基本上是正确的。这只是错误处理的问题。
uint16 shift = index & 15;
uint16 mask = 1 << shift;