正木です。


|原です。
|#やっぱり Integer を返す sqrt と log2 は、欲しいですね。


次のような定義の Integer#bitsize(あるいは bsize) を組み込みにする
というのは如何でしょうか?

0.bitsize = 0
n.bitsize = log2_floor + 1 (n > 0)

-------
/* integer.c */

static int
int_bitsize(int i)
{
  int k = 0;
  while (i >> k++);
  return k-1;
}
static VALUE
rb_int_bit_size(VALUE self)
{
  int i,byte,size;
  if(is_negative(self)) rb_raise(rb_eTypeError,"argument is negative");
  if(FIXNUM_P(self)) return INT2FIX(int_bitsize(FIX2INT(self))); 
  byte=8;
  size=FIX2INT(rb_size(self));
  i=byte*size-1;
  while(is_zero(rb_funcall(self,rb_intern("[]"),1,INT2FIX(i)))) i -= 1;
  return INT2FIX(i+1);
}
void
Init_integer(void)
{
  rb_define_method(rb_cInteger,"bitsize",rb_int_bit_size,0);
  rb_define_method(rb_cInteger,"bsize",rb_int_bit_size,0);
}
------