C 从16位体系结构中的给定索引计算位掩码

C 从16位体系结构中的给定索引计算位掩码,c,bitmask,16-bit,C,Bitmask,16 Bit,我有一个函数,它接受类型为unsigned long的索引变量(此类型无法更改) 我需要将其转换为位掩码,以便索引0的位掩码为1,索引1的位掩码为2,索引2的位掩码为4,依此类推 我已经做了以下工作: mask = 1 << index; mask=1您有正确的方法。但是,实现的问题在于1中的1类型的方法是正确的。但是,实现的问题是基本代码中的1类型是正确的,尽管我注意到您没有指定掩码的类型 如果调用方将大于15的值传递到索引中,您将怎么做?听起来你必须充分利用糟糕的情况。根据您可

我有一个函数,它接受类型为unsigned long的索引变量(此类型无法更改)

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

我已经做了以下工作:

mask = 1 << index;

mask=1您有正确的方法。但是,实现的问题在于
1中的
1
类型的方法是正确的。但是,实现的问题是基本代码中的
1
类型是正确的,尽管我注意到您没有指定
掩码的类型

如果调用方将大于15的值传递到
索引中
,您将怎么做?听起来你必须充分利用糟糕的情况。根据您可以从
func
返回的上下文,您可以断言,也可以继续使用零的
mask

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

uint16 shift = index & 15;
uint16 mask = 1 << shift;
uint16移位=索引&15;

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

如果调用方将大于15的值传递到
索引中
,您将怎么做?听起来你必须充分利用糟糕的情况。根据您可以从
func
返回的上下文,您可以断言,也可以继续使用零的
mask

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

uint16 shift = index & 15;
uint16 mask = 1 << shift;
uint16移位=索引&15;

uint16 mask=1难道不能使用无符号长文本而不是类型强制转换它吗<代码>1UL@ChristianGibbons,也可以。不过,我更喜欢
UINT32\u C
解决方案。奇怪的代码是
((unsigned long)1
,而不是
1UL
。难道你不能用一个unsigned long literal来代替类型转换吗<代码>1UL@ChristianGibbons,也可以。不过,我更喜欢
UINT32\u C
解决方案。奇怪的代码是
((unsigned long)1
,而不是
1UL
1
是有符号的。“使用16位体系结构”-->最好使用
uint16 mask=1u
1
签名。“使用16位体系结构”-->最好使用
uint16掩码=1u
uint32_t mask = UINT32_C(1) << index;
uint16 shift = index & 15;
uint16 mask = 1 << shift;