原です。

あ、エラー処理忘れました。

-----$ bitlength.c
#include <ruby.h>
#include <math.h>

#define BDIGITS(x) ((BDIGIT*)RBIGNUM(x)->digits)
#define BITSPERDIG (SIZEOF_BDIGITS*CHAR_BIT)

static VALUE
rb_fix_bitlength(x)
     VALUE x;
{
    int v = FIX2INT(x), i;

    if (v < 0) rb_raise(rb_eRangeError, "bitlength out of range");
    if (v == 0) return INT2FIX(0);
    for (i = SIZEOF_INT * CHAR_BIT - 2; ((1 << i) & v) == 0; i--) ;
    return LONG2FIX(i + 1);
}

static VALUE
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);
}

void
Init_bitlength(void)
{
    rb_define_method(rb_cFixnum,"bitlength",rb_fix_bitlength,0);
    rb_define_method(rb_cBignum,"bitlength",rb_big_bitlength,0);
}
-----$ bitlength.c


0.bitlength == 0 というのも気になるなあ。