2009-12-19 2 views
4

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

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

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

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

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

ответ

1

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

Я действительно не думаю, что это спасет вас в любое время, чтобы проверить это условие. (Или проверить наличие номеров меньшего размера, то 2)

-1

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

Смежные вопросы