実装したいものを思い描いていたところ、その過程で「整数の1が立ったビットを数える」ということが必要となりました。ところが、Rubyで実装するとかなり遅いことに気づいたので、C言語などで実装してみることにしました(jkr2255/bit_counter)。 先行事例 最近はPOPCNTというCPU命令になるぐらいだし(後述)、だれか実装しているだろうと思ったら、意外とBignumについてはほぼ手付かずだということに気づきました。 「ないんだったら、自分で作ればいいのよ!」 負の数について Rubyの場合、整数が無限桁を(概念上)許容して、しかも負の数は2の補数表現ということもあって、符号ビットの1が無限に続くこととなっています。さすがにこの状態で1の数を数えても「無限大」となって意味がないので、負の数の時は「0の数を数えて、さらにそれをマイナスにして返す」という実装にしました1。 JRuby