えぐち@エスアンドイーです。

Fixnum#>> で、32 を越えるシフト数で0を返していますが、
self < 0 の時は -1 でるべきだと思います。

また、シフト数に負を与えた場合、左シフトを行うべきかと思います。

Fix 前:
  % ruby -ve 'p -1 >> 32; p 1 >> -1'
  ruby 1.5.0 (1999-12-02) [i386-freebsd3.3]
  0
  0

Fix 後:
  % ./ruby -ve 'p -1 >> 32; p 1 >> -1'
  ruby 1.5.0 (1999-12-02) [i386-freebsd3.3]
  -1
  2

パッチつけます。

	えぐち

Mon Dec 6 15:55:30 1999 EGUCHI Osamu <eguchi / shizuokanet.ne.jp> * numeric.c (fix_rshift): Fix -1 >> 32 returned 0. (-1 is true) * numeric.c (fix_rshift): Fix 1 >> -1 returned 0. (2 is true) Index: numeric.c =================================================================== RCS file: /usr/home/eguchi/cvs.netlab.co.jp//ruby/numeric.c,v retrieving revision 1.3 diff -d -u -r1.3 numeric.c --- numeric.c 1999/09/16 09:40:32 1.3 +++ numeric.c 1999/12/06 06:47:06 @@ -1169,12 +1169,10 @@ long i, val; i = NUM2LONG(y); - if (i < sizeof(long) * 8) { - val = RSHIFT(FIX2LONG(x), i); - return INT2FIX(val); - } - - return INT2FIX(0); + if (i < 0) + return fix_lshift(x, INT2FIX(-i)); + val = RSHIFT(FIX2LONG(x), i); + return INT2FIX(val); } static VALUE