前回のN 以下で最大のBのべき乗Rを得る wrp::math::max_power_ofをlibwrpに追加した後、コンパイル時に定数として解決されていた方がコンパイラの最適化的に嬉しい状況に対応する為、テンプレートメタプログラミング版もコードしてみました。libwrpのmath.hxxにtmp::max_power_of_2として追加しました。
(2のべき乗以外はややこしくなる気がするので必要になったら考えようと思います。)
<使用例>
C++, using GeSHi 1.0.8.8
#include <wrp/math.hxx>
int main()
{
return wrp::math::tmp::max_power_of_2<640>::result;
}
Parsed in 0.011 seconds at 8.65 KB/s
VC++10.0でコンパイル、実行すると、
プログラム '[2756] CodeTest.exe: ネイティブ' はコード 512 (0x200) で終了しました。
と、言うわけで640以下で最大の2のべき乗512が求められています。
<実装>
C++, using GeSHi 1.0.8.8
template<size_t N>
struct max_power_of_2
{
private:
template<size_t N, size_t C, size_t R>
struct f_
{
private:
static const size_t c2 = C << 1;
public:
static const size_t result = f_<N, c2, N / c2>::result;
};
template<size_t N, size_t C>
struct f_<N, C, 1>
{
static const size_t result = C;
};
public:
static const size_t result = f_<N, 1, N>::result;
};
Parsed in 0.017 seconds at 22.39 KB/s
与えられたNに対し、C=2^r {r: 0, 1, 2, …}の商を再帰的に求め、商が1となった時のCを返します。
933294ef-e0a5-4338-86ec-32988423f9f0|0|.0