溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java不用算數(shù)運算符怎么實現(xiàn)求和

發(fā)布時間:2022-04-02 15:51:08 來源:億速云 閱讀:153 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Java不用算數(shù)運算符怎么實現(xiàn)求和”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Java不用算數(shù)運算符怎么實現(xiàn)求和”文章能幫助大家解決問題。

Java不用算數(shù)運算符怎么實現(xiàn)求和

題目說了不能用算數(shù)運算符,那么我們就只能從 邏輯運算符 和 移位運算符 入手了。

我們知道 ^ (異或)操作是對兩個數(shù)進行無進位求和,如果兩個數(shù)相加本來就不產(chǎn)生進位,那么該和就是兩數(shù)之和。 這就是解題的關(guān)鍵所在。一般來說,兩數(shù)相加是會產(chǎn)生進位的,而要得到正確的和,應(yīng)該是在 “無進位之和” 的基礎(chǔ)上加上進位,那我們首先應(yīng)該得到進位。我們知道,當(dāng)兩個數(shù)對應(yīng)位置都為1的情況下,才會有進位的產(chǎn)生,即對應(yīng)位置 A&B==1的條件下,就可以得到每一位的進位,但是進位是將這個1加到對應(yīng)的更高一位,所以我們將得到的進位整體進行左移一位,再和之前得到的 “無進位之和” 相加,就可以得到兩數(shù)之和。

我們發(fā)現(xiàn)這里就可以無限套娃了,要得到 “無進位之和” 和 “產(chǎn)生的進位” 之和,那么將這兩個數(shù)再分別看做新的兩個數(shù),對其求和。也是重復(fù)之前的操作,直到兩數(shù)不能產(chǎn)生進位,就可以直接通過 ^ 運算得到結(jié)果。

假設(shè)我們求 23 + 16 的值

Java不用算數(shù)運算符怎么實現(xiàn)求和

Java不用算數(shù)運算符怎么實現(xiàn)求和

根據(jù)上述思路,我們很容易就可以寫出代碼

public static int addAB(int A, int B) {
		// 當(dāng)兩數(shù)的產(chǎn)生的進位為 0,就退出循環(huán),返回其無進位和,就是結(jié)果
        while ((A & B) != 0) {
            int A_B = A ^ B;// 無進位求和
            int AB = (A & B) << 1;// 得到進位
            // 接下來就是求 得到的進位 + 無進位之和,重復(fù)前面的操作,直到不產(chǎn)生進位
            A = A_B;
            B = AB;
        }
        // 最后返回新的無進位之和
        return (A ^ B);
    }

那么為了驗證它的正確性,我們這里使用對數(shù)器,將該函數(shù)與 &rsquo; + &rsquo; 運算符比較。

public static void main(String[] args) {
    int count = 1_0000_0000;// 比較次數(shù) 100000000次
    Random random = new Random();// 生成隨機數(shù)字
    boolean flag = true;// 相等則為 true

    for (int i = 0; i < count; i++) {
        int num1 = random.nextInt(Integer.MAX_VALUE/2);// 隨機正數(shù)1
        int num1_2 = random.nextInt(Integer.MAX_VALUE/2);// 隨機正數(shù)2
        // 隨機正數(shù)1 + 隨機正數(shù)2
        if ((num1+num1_2) != addAB(num1,num1_2)){
            // 有一次不相等的,則退出循環(huán)
            flag = false;
            break;
        }

        int num2 = -random.nextInt(Integer.MAX_VALUE/2);// 隨機負數(shù)1
        int num2_2 = -random.nextInt(Integer.MAX_VALUE/2);// 隨機負數(shù)2
        // 隨機負數(shù)1  + 隨機負數(shù)2
        if ((num2+num2_2) != addAB(num2,num2_2)){
            // 有一次不相等的,則退出循環(huán)
            flag = false;
            break;
        }

        int num3 = random.nextInt(Integer.MAX_VALUE);// 隨機正數(shù)
        int num4 = -random.nextInt(Integer.MAX_VALUE);// 隨機負數(shù)
        // 隨機正數(shù)  + 隨機負數(shù)
        if ((num3+num4) != addAB(num3,num4)){
            // 有一次不相等的,則退出循環(huán)
            flag = false;
            break;
        }
    }
    System.out.println(flag);
}

運行結(jié)果:

Java不用算數(shù)運算符怎么實現(xiàn)求和

最后輸出結(jié)果為 true ,說明我們計算隨機產(chǎn)生的 正數(shù)+正數(shù)、負數(shù)+負數(shù)、正數(shù)+負數(shù) 分別100000000次,沒有一次出錯,說明該函數(shù)可靠。

關(guān)于“Java不用算數(shù)運算符怎么實現(xiàn)求和”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI