2進桁数計算の便利さ

昔、わんくまブログで書いた

この2進桁数を高速に求める関数

int binaryDigit(unsigned int val)
{
    int digit = 0; 
    digit += (((val >> 16) + 0xFFFF) & 0x10000) >> 12;
    digit += (((val >> digit) + 0xFF00) & 0x10000) >> 13; 
    digit += (((val >> digit) + 0xF0) & 0x100) >> 6; 
    digit += (((val >> digit) + 0xC) & 0x10) >> 3; 
    digit += (((val >> digit) + 0x2) & 0x4) >> 2; 
    return digit + 1;
}

が意外と便利。
OpenGL ES のテクスチャの縦横のサイズは2のべき乗じゃないとダメなので、そうするための関数が、

unsigned int floor(unsigned int val)
{
    return 1 << binaryDigit(val - 1);
}

こんなに簡単に書けたり。
いやまあ、binaryDigit 自体はどんな内容でもいいんだけど……。