我正在将我的代码库的许多位操作函数转换为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
,并且坐在他们中间嘲笑我。=)