ネタ元 → 脳内1%は秘密(笑)
「ある数値(integer)を二進数で表現したときに必要なbit数を簡単/高速に求めるには」
んー…
[1] 0になるまで2で割り続け、何回割ったかが二進数での桁数となります。
が、これだと最大32回の繰り返しが生じます(intが32bitなら)。
もっと簡単な方法があるかと言われますと...
R進数表現での桁数をnとすれば、R^n = 2^x とおくと n・logR = x・log2 なので
x = n・logR/log2 となります。 十進数すなわち R=10 とおけば、
x = n・log10/log2 ≒ 3.32・n
[2] よーするに十進での桁数を3.3倍(とちょっと)すると概ね二進での桁数となりますな。
ただしこの方法ではもっすご荒っぽい桁数しか得られません。
100も999も(3桁×3.3)二進で10桁だとゆー。
さらにこのやりかたでは十進で何桁かを求めにゃなりません。
よーするに0になるまで10で割り続け、何回割ったかを必要とします。
32bit-integerだと最大10回くらいは割らにゃならんのよね。
[3] 数学関数 Math.Log(double, double) で一気に求めることもできるけど、
単純にループ回すより速いとは思えないし...
で、いっちゃん手軽で速いのはやっぱ[1]になんでないかなーとか思います。
ざっくりした桁数でいいのなら
- 0になるまで4で割り、割った回数×2 とか
- 0になるまで8で割り、割った回数×3 とか
もアリかもです。