C++ 将函数转换为单个方程的困难(constexpr)

C++ 将函数转换为单个方程的困难(constexpr),c++,c++11,constexpr,C++,C++11,Constexpr,我正在将代码库中的许多位操作函数转换为constexpr。没有真正的理由这么做,大部分是因为 在C++11中生成一个函数constexpr需要代码是一个表达式,这并不总是可能的(也不总是需要的) 无论如何,我在使用此函数时遇到了一些问题: //Given a binary value like 00000100011, fills every bit below the highest '1' bit with a '1'. //Example: 00000100011 -> 000001

我正在将代码库中的许多位操作函数转换为
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;
}
以下是我写的一次尝试:

问题是,
constexpr
不允许修改变量或将结果存储在变量中,因此复合或赋值|=运算符不可用

这意味着要将函数放在一个方程中,我必须进行大量的OR和位移位,因为我不能将中间结果存储在变量中

有没有人能找到解决这个问题的方法,或者有一个更好的方程,它是有效的constexpr,可以提供相同的结果?
这对我来说不是一个关键问题,但却是一组函数中唯一一个我无法转换为
constexpr
,并坐在它们中间嘲笑我的函数。=)

您可以从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);
}

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

为什么不在运行时对函数求值(可能给定一个非常量值),速度会慢一些(需要31位移位和or)。我下面的回答显示了如何以一种具有相同运行时性能的方式来完成它。@Dave,啊,我的错误。它们不一样。我在简化方面做错了。哎呀,你说得对(关于双OR)!在试图转换它时,这是一个错误。这工作得很完美——我没有考虑过将它分解成单独的函数。
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);
}