近岡です。

いまさらという気がしますが、bitlengthのプログラムです。

Subject: [ruby-math:00950] Re: New methods of Integer
>rb_big_bitlength(x)
>     VALUE x;
>{
>    long len, i;
>    BDIGIT u;
>
>    if (!RBIGNUM(x)->sign)
>        rb_raise(rb_eRangeError, "bitlength out of range");
> 
>    len = RBIGNUM(x)->len;
>    u = BDIGITS(x)[len - 1];
>    if (u == 0) return INT2FIX(1);
>    for (i = BITSPERDIG - 1; (((BDIGIT)1 << i) & u) == 0; i--) ;
>    return LONG2FIX((len - 1) * BITSPERDIG + i + 1);
>}
の最後の数行を

    len = RBIGNUM(x)->len;
    u = BDIGITS(x)[len - 1];
    i = (len - 1) * BITSPERDIG;
    while (u > 0) { 
        u >>= 1; i += 1;
    }
    return LONG2FIX(i);

とすることもできますね。
手元にrubyのソースをコンパイルできる環境がないので
確認はしていませんが。

BDIGIT が無符号の整数型で、
プログラム中の u >>= 1; が論理シフトだから、
無限ループに、はまることはないはず。
でも、BIGNUMの内部構造が変わったり、
コンパイラの都合などで、
算術シフトとなると危険です。
将来のメンテナンスのことを考えると、
ちょっと気が引けます。

0----+----1----+----2----+----3----+----4----+----5----+----6
近岡 宣吉  Chikaoka, Nobuyoshi
富山県立高岡西高等学校(数楽科)
 E-mail : chikaoka-nobuyoshi / tym.ed.jp