0

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

4

1 回答 1

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);
}

此外,您的原始函数在每行中使用两次值进行或运算。

于 2013-03-17T22:05:38.423 回答