やあみんな、寒いけど元気にしてたかな?今日はこんなぐだぐだなタイトルだよ。負でない整数xがあるときに、これ以上の値をとる、最小の2のべき乗数の計算方法についてだ。以下の4通りの実装をしてみた。
int PadToPow2( const unsigned int x ){ // x より大きい、最小の2のべき乗数を計算します。 #if 01 int cnt=1; for( int val=x; val>0; val/=2, cnt*=2 ); return 2*x==cnt ? x: cnt; #elif 0 int result = pow( 2, 1+floor( log((double)x)/log(2.0) ) ); return 2*x==result? x: result; #elif 0 unsigned int i = sizeof(int)*8-1; for( ; !((x-1)&(1<<i)) && i>0; --i ); return 1<<(i+1); #else int i; int val=1; for( i=0; i<12; ++i ){// 当然4096以上の値に対応せず。 if( x< val ){ break; } val *=2; } return val; #endif }
これらの速度を調べてみたところ、どれも違いは数パーセントずつなわけなのだけれども、一番上の最初の方法が万能かつ常に最も高速らしいというわけなのでここにメモしておくぞ。
任意サイズ画像を拡張なしのOpenGLで使うテクスチャデータにしたい場合、その最適サイズを見繕うのにもってこいだなこりゃ。
でももっと高速な方法を見つけたなら、教えてくれよな!じゃ!