unsigned int i = 0, x = n;
while (x >>= 1) ++i;
return n ^ x ? i + 1 : i;

さっき思いついたコードです。これが最速になるかなと思いましたが…
>>787 これ面白いですね。ベンチマークをとってみましたが僕が考えたコードより1.3倍ほど高速っぽいです

>>786 これは例にあげた仕様とちょっと違いますね。僕も最初に同じミスをしましたが
ちなみにこの結果は、上記のコードから i=1 に初期化した状態で
while (x >>= 1) ++i; 部分だけを抽出した結果と同じですね