C の最上位ビットを見つける

Hacker's Delight より:

int hibit(unsigned int n) {
    n |= (n >>  1);
    n |= (n >>  2);
    n |= (n >>  4);
    n |= (n >>  8);
    n |= (n >> 16);
    return n - (n >> 1);
}

このバージョンは 32 ビット整数用ですが、ロジックは 64 ビット以上に拡張できます。


fls 多くのアーキテクチャでは、ハードウェア命令が底をつきます。これがおそらく最も簡単で最速の方法だと思います。

1<<(fls(input)-1)

これでうまくいくはずです。

int hob (int num)
{
    if (!num)
        return 0;

    int ret = 1;

    while (num >>= 1)
        ret <<= 1;

    return ret;
}

hob(1234) は 1024 を返します
hob(1024) は 1024 を返します
hob(1023) は 512 を返します