您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java怎么用位運算實現(xiàn)加減運算”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java怎么用位運算實現(xiàn)加減運算”吧!
先分析如何用位運算實現(xiàn)加法運算。
假設(shè)a=23
,b=36
,使用位運算實現(xiàn)加法得到結(jié)果59
。
首先來看下23
、36
、59
的二進制信息。
從上面的圖中可以看到,兩個數(shù)相加的結(jié)果與兩個數(shù)異或的結(jié)果很相似,只不過在圖中的2位置相加的時候,產(chǎn)生了進位,而異或是沒有進位的,如果能拿到進位信息,把兩個數(shù)異或的結(jié)果和進位信息的結(jié)果相加就能得到最終結(jié)果了,那么如果能拿到進位信息呢?
上圖中,59
的二進制信息可以分為兩部分,0110011
和 0001000
,再結(jié)合23
、36
的二進制信息來看,0110011
為23
和36
的異或結(jié)果,而23
和36
相與的結(jié)果跟0001000
很相似,只不過0001000
中的1
比相與結(jié)果往前移了一位。
于是,我們可以得出,兩個數(shù)的二進制進位信息為兩個數(shù)的相與在左移一位。
經(jīng)過上面的分析,我們可以得到了一個初步的運算結(jié)果,即兩個數(shù)相加等于兩個數(shù)異或加上兩個數(shù)的相與左移1位,也就是a + b = (a ^ b) + ((a & b) << 1)
。
先用23
和36
來驗證下。
經(jīng)過驗證可以看到,剛才得出的結(jié)論是正確的。
但是,我們要做到在整個運算過程中不能出現(xiàn)加號,接下來要想辦法把這個加號給去掉。
還是以23
和36
為例,經(jīng)過上面的運算我們把運算的位運算結(jié)果給化簡下。
23 + 36 = (23 ^ 36) + ((23 & 36) << 1) = 51 + 8
也就是把23
和36
的相加運算轉(zhuǎn)化為了51
和8
的相加運算,接下來繼續(xù)分析51
和8
的相加運算,也是通過異或和相與進行操作。
51 + 8 = (51 ^ 8) + ((51 & 8) << 1) = 59 + 0
嗯?可以發(fā)現(xiàn)我們已經(jīng)得出59
了,而且還加了個0
,加了個0
不就相當(dāng)于加了個寂寞嘛,可以直接省略啊。
由此,我們又可以得出一個結(jié)論,兩個數(shù)的二進制進位信息為兩個數(shù)的相與在左移一位,不停地循環(huán)這個過程,直到有一個數(shù)變?yōu)?,就能得到結(jié)果。
現(xiàn)在來總結(jié)下整體的計算過程:
把兩個數(shù)相加,拆分成兩步,兩個數(shù)異或加上兩個數(shù)相與左移1位。
判斷相與左移的結(jié)果是否為0。
如果相與左移為0,兩個數(shù)異或的結(jié)果即為相加的結(jié)果。
如果相與左移結(jié)果不為0,把得到的新結(jié)果,重復(fù)執(zhí)行第1~3步操作。
經(jīng)過上面的分析,來看下代碼實現(xiàn)。
public class Code19_Add { public static int add(int a, int b) { int sum = 0; while (b != 0) { sum = a ^ b; b = (a & b) << 1; a = sum; } return sum; } public static void main(String[] args) { int sum = add(23, 36); System.out.println(sum); } }
運行程序,輸出結(jié)果為59。
還是以23
和36
為例,如果要計算 36 - 23
,該怎么辦?
36 - 23
不就相當(dāng)于36 + (-23)
,可以理解為加上一個負(fù)數(shù),這就可以了嗎?不不不,要求的是不能出現(xiàn)加減符號,-23
里面是有減法這個符號的。
還記得前面我們分析的負(fù)數(shù)可以怎么表示嗎?對了,負(fù)數(shù)是對一個數(shù)的取反再加1。嗯?又出現(xiàn)加號了,不過加法我們不是已經(jīng)實現(xiàn)了嗎?直接拿來用就好了。
有了加法操作,減法就很簡單了,來看下代碼。
public class Code20_Sub { public static int add(int a, int b) { int sum = 0; while (b != 0) { sum = a ^ b; b = (a & b) << 1; a = sum; } return sum; } public static int sub(int a, int b) { return add(a, add(~b, 1)); } public static void main(String[] args) { int sum = sub(36, 23); System.out.println(sum); } }
運行一下輸出結(jié)果為13
。
感謝各位的閱讀,以上就是“Java怎么用位運算實現(xiàn)加減運算”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Java怎么用位運算實現(xiàn)加減運算這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責(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)容。