C++ でコンパイル時に 2^n に切り上げる
C++ で速度を要求されるプログラムを書いていると、コンパイル時に定数を 2^n に切り上げたいことがあります。というか、必要だったので書いた。
template<size_t N> struct RoundUp { template<size_t M, size_t D> struct _Between { static const size_t MidV = 1 << (M + D / 2); static const size_t Value = N <= MidV ? _Between<M, D / 2>::Value : _Between<M + D / 2, D - D / 2>::Value; }; template<size_t M> struct _Between<M, 1> { static const size_t Value = 1 << (M + 1); }; static const size_t Value = _Between<0, 31>::Value; };
このクラス定義を書いておくと、たとえば、 22222 を 2 のべき乗に切り上げた値を
static const size_t upperBound = RoundUp<22222>::Value; // => 32768
のようにして定数として求めることができる。
面倒だから、せめて再帰のループに展開したかったんだけど、仕様上テンプレートは16段までしかネストてきないから二分探索にしなきゃいけないしもうよっぱらてっおえうんとせう
PS. @qnighy さんに再帰なしで書く方法教えてもらいました! これは(・∀・)イイ!!! > Ideone.com - EStSRd - Online C++ Compiler & Debugging Tool