【发布时间】:2012-03-25 22:29:13
【问题描述】:
Following my previous question,我需要创建一个由设置为 1 的固定位组成的值。我使用了以下函数:
void MaskAddRange(UINT& mask, UINT first, UINT count)
{
mask |= ((1 << count) - 1) << first;
}
但是,正如我们所发现的,它对于count = 32 不能正常工作。在这种情况下,1 << count 的结果理论上是未定义的行为(或结果),实际上在 x86 上它是 1,因为移位操作数被视为模 32。 p>
我也想修复这个表达式,使其在这种极端情况下也能正常工作。最简单/最好/最有效的方法是什么?
通过分支(if、?)处理这种特定情况有点简单,虽然丑陋,但我敢打赌它也效率低下。
另一种方法是将移位操作数提升为更大的类型(64 位)。我的意思是:
void MaskAddRange(UINT& mask, UINT first, UINT count)
{
mask |= (UINT(unsigned __int64(1) << count) - 1) << first;
}
有没有更好的办法?
【问题讨论】:
-
嗯。你能添加一个简单、简短、简明的函数所需行为的描述吗?我宁愿不必对有问题的代码中的要求进行逆向工程。
-
void MaskAddRange(UINT& mask, UINT first, UINT count){...}是 C 中的语法错误。也许你的意思是 C++? -
@wildplasser:是的,我的意思是 C++。我不想标记问题 C++,因为问题本身与 C++ 无关
-
在 C 中,人们可能会编写类似
mask |= ((1ull << count) - 1) << first;的内容并将其放入“函数样式”宏中,因为 C 不知道引用调用。
标签: c bit-manipulation