int bits = 1 + log2(100); => bits == 7
代码很简单:Math.log(n,2).
运行速度有点棘手,但你可以用一种“二进制搜索”来实现:
int bits = 1; for (int b = 16; b >=1; b/=2) { int s = 1 << b; if (n >= s) { n>>=b; bits+=b; } }
我不是100%确定我有逻辑,但希望这个想法很清楚. .NET VM中可能会有一些开销,但原则上应该更快.
for循环初始化器中的16是基于int所需的位数的一半.如果您正在使用多种方式,请在32级开始