強火で進め

このブログではプログラム関連の記事を中心に書いてます。

2の累乗(べき乗)であるかどうかをシンプルなプログラムでチェック

OpenGLを使っているとテクスチャがちゃんと2の累乗(べき乗)のサイズかどうかをチェックする場面が有るかと思います。
※2の累乗とは2,4,8,16,32など2を何回か掛けた値の事です。
OpenGLのバージョンやハードによっては2の累乗じゃ無くても良い時もあります。

その判定をシンプルに行っている記事がTwitterで紹介されていて、非常にナルホドという記述だったので紹介。

記事はこちら

WebGL and OpenGL Differences - WebGL Public Wiki
http://khronos.org/webgl/wiki/WebGL_and_OpenGL_Differences

該当プログラムはこちらになります。

function isPowerOfTwo(x) {
    return (x & (x - 1)) == 0;
}

例えば8だった場合はビットで表すと 1000 となり、それを-1すると 0111 となります。この様に2の乗数の場合にはちょうどビットが 1 & 1 となるのを回避する並びになり、結果は0となります。それ以外のパターンであれば、いずれかの桁で両方のビットが立っている桁が発生するため結果は0以外となります。

こういうカッコ良いプログラムをサラッと書ける様になりたいものです。