繁体   English   中英

使用按位运算符将两个整数相除

[英]Divide two integers using bitwise operators

我必须仅使用按位运算符将两个数相除。 我的代码如下:

public class Solution {
    public int divide(int dividend, int divisor) {
        int c = 0, sign = 0;
        if (dividend < 0) {
            dividend = negate(dividend);
            sign^=1;
        }
        if (divisor < 0) {
            divisor = negate(divisor);
            sign^=1;
        }
        if ( divisor != 0){
           while (dividend >= divisor){
                dividend = sub(dividend, divisor);
                c++;
            } 
        }

        if (sign == 1){
            c = negate(c);
        }
        return c;
    }

    private int negate(int number){
        return add(~number,1);
    }
    private int sub(int x, int y){
        return add(x,negate(y));
    }
    private int add(int x, int y){
        while ( y != 0){
          int carry = x&y;
          x = x^y;
          y = carry << 1;
        }
        return x;
    }
}

我在运行代码时遇到超时异常:

Last executed input:
2147483647
1

我在这样的代码中添加了额外的检查:

if (divisor == 1){
    return dividend;
}

但是然后再次运行代码时,出现了如下超时异常:

Last executed input:
2147483647
2

您能帮我解决代码错误吗?

由于您使用的是朴素的算术实现,因此我假设它花费的时间太长,因为它必须进行约10亿次减法,每个减法平均循环16次迭代。 因此,如果每个内部步骤花费1个周期,则在3GHz CPU上大约需要5秒钟。 但是由于显然需要更多的时间,尤其是考虑到它是在Java中运行的,所以我想您可以轻松地期望运行1分钟左右的时间。 也许Java对您正在其中运行的环境进行了超时检查。

我必须承认,我还没有完全验证您的代码,并假设它在算法方面正常工作。

想一想除法要持续多久 ,我们在学校都学过的纸笔除法方法。

当然,我们已经在10基础中学习了它,但是有什么理由为什么相同的算法在2基础中不起作用?

不,实际上,这很容易,因为当您对每个数字进行除法步骤时,如果除数之上的被除数部分大于或等于除数,则结果为1,否则为0。

移位除数和结果也很简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM