Беззнаковое деление Java без длинного приведения?

StackOverflow https://stackoverflow.com/questions/1931904

  •  20-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top