更容易+做二元分割的最佳方式

时间:2013-12-16 20:35:48

标签: java performance algorithm binary

有人可以建议在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;
}

2 个答案:

答案 0 :(得分:3)

简短的回答是划分是一种难以实现的算法。

您在上面概述的算法每次迭代产生一位,并且(作为分频器)它非常简单。

还有其他算法每次迭代也产生1位(例如,CORDIC和二进制恢复)。它们都不是一两个班轮,但你可能发现其中一个更简单,更容易理解。

还有其他分频器算法可以在每次迭代时产生更多位。例如,SRT radix-4分频器每次迭代可产生4位。费用是该算法甚至更多复杂。如果你对你给出的算法有困难,我的直接猜测就是你会发现它们介于可怕和完全没有希望之间。

答案 1 :(得分:2)

你的直觉是正确的;这是一个单行:

private static int div(int dividend, int divisor) {
  return dividend / divisor;
}