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 的值


根據(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ù)與 ’ + ’ 運算符比較。
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);// 隨機負(fù)數(shù)1
int num2_2 = -random.nextInt(Integer.MAX_VALUE/2);// 隨機負(fù)數(shù)2
// 隨機負(fù)數(shù)1 + 隨機負(fù)數(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);// 隨機負(fù)數(shù)
// 隨機正數(shù) + 隨機負(fù)數(shù)
if ((num3+num4) != addAB(num3,num4)){
// 有一次不相等的,則退出循環(huán)
flag = false;
break;
}
}
System.out.println(flag);
}
運行結(jié)果:

最后輸出結(jié)果為 true ,說明我們計算隨機產(chǎn)生的 正數(shù)+正數(shù)、負(fù)數(shù)+負(fù)數(shù)、正數(shù)+負(fù)數(shù) 分別100000000次,沒有一次出錯,說明該函數(shù)可靠。
到此這篇關(guān)于Java不用算數(shù)運算符來實現(xiàn)求和方法的文章就介紹到這了,更多相關(guān)Java 求和 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring框架事務(wù)屬性中事務(wù)隔離級別與傳播行為全面講解
這篇文章主要介紹了Spring框架聲明式事務(wù)的事務(wù)隔離級別和事務(wù)傳播行為,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-11-11
Java基礎(chǔ)學(xué)習(xí)之IO流應(yīng)用案例詳解
這篇文章主要為大家詳細介紹了Java?IO流的三個應(yīng)用案例:點名器、集合到文件和文件到集合,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2022-09-09
Java后端產(chǎn)生驗證碼后臺驗證功能的實現(xiàn)代碼
這篇文章主要介紹了Java后臺產(chǎn)生驗證碼后臺驗證功能,本文文字結(jié)合實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-06-06
java中數(shù)組的相關(guān)知識小結(jié)(推薦)
下面小編就為大家?guī)硪黄猨ava中數(shù)組的相關(guān)知識小結(jié)(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-07-07
Spring Boot 自定義 Shiro 過濾器無法使用 @Autowired問題及解決方法
這篇文章主要介紹了Spring Boot 自定義 Shiro 過濾器無法使用 @Autowired問題及解決方法 ,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-06-06

