Java без знака деления без приведения к длинному? - PullRequest
4 голосов
/ 19 декабря 2009

Я написал интерпретатор, который требует от меня выполнения 32-разрядного деления целых чисел без знака. В Java я могу сделать это как:

reg[a] = (int) ((reg[b] & 0xFFFFFFFFL) / (reg[c] & 0xFFFFFFFFL));

Но я бы хотел избежать преобразования в long и обратно в int. Java уже предоставляет беззнаковый оператор смещения вправо >>> для этого особого случая, поэтому, возможно, есть умный способ сделать беззнаковое деление таким же образом.

Обратите внимание, что сложение и умножение работают нормально, так как два числа комплимента просто работают.

Есть ли лучший способ сделать это в Java?

Ответы [ 2 ]

1 голос
/ 19 декабря 2009

Ну, если вы сдвинетесь вниз на один бит, вы можете разделить получающиеся два числа, а затем сдвинуться вверх дважды (потому что результирующее число будет в 4 раза меньше). Но это будет работать только на четные числа, так как вы потеряете наименее значимый бит.

Я не думаю, что это сэкономит вам время на проверку этого состояния. (или проверьте число меньше 2 31 )

0 голосов
/ 19 декабря 2009

Вы всегда можете использовать BigInteger, который работает с целыми числами произвольного размера, но это будет намного дороже, чем повышение до long и приведение обратно к int. Вы намерены улучшить производительность (следовательно, вы хотите, чтобы решение «чисто целочисленное», чтобы не было времени на приведение) или улучшить читаемый / понятный код (в этом случае BigInteger может быть более точным)?

...