我将代码库的许多位操作函数转换为constexpr
。没有真正的理由这样做,主要是“仅仅因为”。
在C ++ 11中创建函数constexpr要求代码是单个表达式,这并不总是可行的(并且并不总是需要)。
无论如何,我在使用这个功能时遇到了一些麻烦:
//Given a binary value like 00000100011, fills every bit below the highest '1' bit with a '1'.
//Example: 00000100011 -> 00000111111
inline uint32_t FillUntilHighestBit(uint32_t value)
{
value |= (value >> 1);
value |= (value >> 2);
value |= (value >> 4);
value |= (value >> 8);
value |= (value >> 16);
return value;
}
以下是我写的一次尝试:http://ideone.com/BeQZUH
return (value |= (value |= (value |= (value |= (value |= (value >> 1)) >> 2) >> 4) >> 8) >> 16);
问题是,constexpr
不允许修改变量或将结果存储在变量中,因此复合OR赋值| =运算符不存在。
这意味着要将函数放在一个等式中,我必须进行大量的OR和位移,因为我无法将中间结果存储在变量中。
任何人都可以看到这方面的任何方法,或者有一个更好的方程式是有效的constexpr,提供相同的结果?
这对我来说不是一个关键问题,但它是我无法转换为constexpr
的一组函数中唯一的一个,并且坐在那里嘲弄我。 =)
答案 0 :(得分:2)
你可以在constexpr中调用另一个constexpr,所以你可以把它写成:
constexpr uint32_t internalFunc(uint32_t value,int s) {
return (value >> s) | value;
}
constexpr uint32_t FillUntilHighestBit(uint32_t value) {
return internalFunc(
internalFunc(
internalFunc(
internalFunc(
internalFunc(value,1)
,2)
,4)
,8)
,16);
}
此外,您的原始函数每行输入两次值。