コードベースのビット操作関数の多くを に変換していました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
私を罵倒している最中にそこに座っています. =)