Following my previous question,我需要创建包括设置为1的位的固体范围的值I中使用下列的函数:设置一个位范围中的序
void MaskAddRange(UINT& mask, UINT first, UINT count)
{
mask |= ((1 << count) - 1) << first;
}
然而,如发现,它没” t对于count = 32
正确工作。的1 << count
在这样的情况下结果理论上是未定义的行为(或结果),和几乎在x86是1,因为换档操作数处理的模数为32
欲解决这个表达式为正常工作这个极端的例子也是。什么是最简单/很好/有效的方式来做到这一点?
通过分支(if
,?
)处理这个特定的情况虽然很丑,但有点简单,我敢打赌它也是低效的。
另一种方法是将移位操作数提升为更大类型(64位)。我的意思是:
void MaskAddRange(UINT& mask, UINT first, UINT count)
{
mask |= (UINT(unsigned __int64(1) << count) - 1) << first;
}
有没有更好的方法?
为什么不使用'UINT(-1)'? – 2012-03-25 14:24:33
@Kerrek SB:怎么样? – valdo 2012-03-25 14:26:08
嗯。你可以添加一个简单的,简短的简要描述你的函数所需的行为吗?我不希望从有问题的代码中反向设计需求。 – 2012-03-25 14:27:40