有人可以建议在Java中使用二进制除法而不使用递归的最简单+最佳方式吗?
我有以下代码即使工作正常,但我相信这个基本的数学函数在这里应该更容易。
private static int div(int dividend, int divisor) {
int denom = divisor;
int count = 1;
while (denom <= dividend) {
denom <<= 1;
count <<= 1;
}
if (denom > dividend) {
denom >>= 1; count >>= 1;
}
int answer = 0;
// Now find the smaller dividend
while (count != 0) {
if (dividend >= denom) {
dividend = dividend - denom;
// Consume the count value;
answer = answer + count;
}
count >>>= 1;
denom >>= 1;
}
return answer;
}
答案 0 :(得分:3)
简短的回答是划分是一种难以实现的算法。
您在上面概述的算法每次迭代产生一位,并且(作为分频器)它非常简单。
还有其他算法每次迭代也产生1位(例如,CORDIC和二进制恢复)。它们都不是一两个班轮,但你可能发现其中一个更简单,更容易理解。
还有其他分频器算法可以在每次迭代时产生更多位。例如,SRT radix-4分频器每次迭代可产生4位。费用是该算法甚至更多复杂。如果你对你给出的算法有困难,我的直接猜测就是你会发现它们介于可怕和完全没有希望之间。
答案 1 :(得分:2)
你的直觉是正确的;这是一个单行:
private static int div(int dividend, int divisor) {
return dividend / divisor;
}