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