您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java不用算數運算符怎么實現求和”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Java不用算數運算符怎么實現求和”文章能幫助大家解決問題。
題目說了不能用算數運算符,那么我們就只能從 邏輯運算符 和 移位運算符 入手了。
我們知道 ^ (異或)操作是對兩個數進行無進位求和,如果兩個數相加本來就不產生進位,那么該和就是兩數之和。 這就是解題的關鍵所在。一般來說,兩數相加是會產生進位的,而要得到正確的和,應該是在 “無進位之和” 的基礎上加上進位,那我們首先應該得到進位。我們知道,當兩個數對應位置都為1的情況下,才會有進位的產生,即對應位置 A&B==1的條件下,就可以得到每一位的進位,但是進位是將這個1加到對應的更高一位,所以我們將得到的進位整體進行左移一位,再和之前得到的 “無進位之和” 相加,就可以得到兩數之和。
我們發現這里就可以無限套娃了,要得到 “無進位之和” 和 “產生的進位” 之和,那么將這兩個數再分別看做新的兩個數,對其求和。也是重復之前的操作,直到兩數不能產生進位,就可以直接通過 ^ 運算得到結果。
假設我們求 23 + 16 的值
根據上述思路,我們很容易就可以寫出代碼
public static int addAB(int A, int B) { // 當兩數的產生的進位為 0,就退出循環,返回其無進位和,就是結果 while ((A & B) != 0) { int A_B = A ^ B;// 無進位求和 int AB = (A & B) << 1;// 得到進位 // 接下來就是求 得到的進位 + 無進位之和,重復前面的操作,直到不產生進位 A = A_B; B = AB; } // 最后返回新的無進位之和 return (A ^ B); }
那么為了驗證它的正確性,我們這里使用對數器,將該函數與 ’ + ’ 運算符比較。
public static void main(String[] args) { int count = 1_0000_0000;// 比較次數 100000000次 Random random = new Random();// 生成隨機數字 boolean flag = true;// 相等則為 true for (int i = 0; i < count; i++) { int num1 = random.nextInt(Integer.MAX_VALUE/2);// 隨機正數1 int num1_2 = random.nextInt(Integer.MAX_VALUE/2);// 隨機正數2 // 隨機正數1 + 隨機正數2 if ((num1+num1_2) != addAB(num1,num1_2)){ // 有一次不相等的,則退出循環 flag = false; break; } int num2 = -random.nextInt(Integer.MAX_VALUE/2);// 隨機負數1 int num2_2 = -random.nextInt(Integer.MAX_VALUE/2);// 隨機負數2 // 隨機負數1 + 隨機負數2 if ((num2+num2_2) != addAB(num2,num2_2)){ // 有一次不相等的,則退出循環 flag = false; break; } int num3 = random.nextInt(Integer.MAX_VALUE);// 隨機正數 int num4 = -random.nextInt(Integer.MAX_VALUE);// 隨機負數 // 隨機正數 + 隨機負數 if ((num3+num4) != addAB(num3,num4)){ // 有一次不相等的,則退出循環 flag = false; break; } } System.out.println(flag); }
運行結果:
最后輸出結果為 true ,說明我們計算隨機產生的 正數+正數、負數+負數、正數+負數 分別100000000次,沒有一次出錯,說明該函數可靠。
關于“Java不用算數運算符怎么實現求和”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。