C 从16位体系结构中的给定索引计算位掩码
我有一个函数,它接受类型为unsigned long的索引变量(此类型无法更改) 我需要将其转换为位掩码,以便索引0的位掩码为1,索引1的位掩码为2,索引2的位掩码为4,依此类推 我已经做了以下工作: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的值传递到索引中,您将怎么做?听起来你必须充分利用糟糕的情况。根据您可
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=1u1
签名。“使用16位体系结构”-->最好使用uint16掩码=1u
uint32_t mask = UINT32_C(1) << index;
uint16 shift = index & 15;
uint16 mask = 1 << shift;