簡體   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