>> は「算術シフト」で 31bit 目が 30bit 目にコピーされます。 B% = B% >> 1 を B% = (B% >> 1) and &h7fffffff として 31bit 目に 0 を入れてやれば、「論理シフト」となり、 b% の符号で分岐する必要がなくなります。 あまさとさんのコードはバグってるので、おーみのみのさんのコードをベースにすればいいと思います。