难以将函数转换为单个方程(constexpr)

Difficulty converting function to a single equation (constexpr)

本文关键字:方程 constexpr 单个 函数 转换      更新时间:2023-10-16

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

你可以在一个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-ing。