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 を返します