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

ここに私が書いた1つの試みがあります: 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);
}

また、元の関数は、各行で値を 2 回 or-ing しています。

于 2013-03-17T22:05:38.423 に答える