[英]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.