从 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 short
、uint16
或类似的,具体取决于您的环境。但除此之外,你的第一次尝试基本上是正确的。只是错误处理的问题。
uint16 shift = index & 15;
uint16 mask = 1 << shift;
我有一个函数接受 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 short
、uint16
或类似的,具体取决于您的环境。但除此之外,你的第一次尝试基本上是正确的。只是错误处理的问题。
uint16 shift = index & 15;
uint16 mask = 1 << shift;