<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文主要介紹如何使用位運算來實現加減功能,也就是在整個運算過程中不能出現加減符號。
加減乘除運算在計算機中,實際上都是用位運算實現的,今天就用位運算來模擬下加法和減法的運算功能。
先分析如何用位運算實現加法運算。
假設a=23
,b=36
,使用位運算實現加法得到結果59
。
首先來看下23
、36
、59
的二進位制資訊。
從上面的圖中可以看到,兩個數相加的結果與兩個數互斥或的結果很相似,只不過在圖中的2位置相加的時候,產生了進位,而互斥或是沒有進位的,如果能拿到進位資訊,把兩個數互斥或的結果和進位資訊的結果相加就能得到最終結果了,那麼如果能拿到進位資訊呢?
上圖中,59
的二進位制資訊可以分為兩部分,0110011
和 0001000
,再結合23
、36
的二進位制資訊來看,0110011
為23
和36
的互斥或結果,而23
和36
相與的結果跟0001000
很相似,只不過0001000
中的1
比相與結果往前移了一位。
於是,我們可以得出,兩個數的二進位制進位資訊為兩個數的相與在左移一位。
經過上面的分析,我們可以得到了一個初步的運算結果,即兩個數相加等於兩個數互斥或加上兩個數的相與左移1位,也就是a + b = (a ^ b) + ((a & b) << 1)
。
先用23
和36
來驗證下。
經過驗證可以看到,剛才得出的結論是正確的。
但是,我們要做到在整個運算過程中不能出現加號,接下來要想辦法把這個加號給去掉。
還是以23
和36
為例,經過上面的運算我們把運算的位運算結果給化簡下。
23 + 36 = (23 ^ 36) + ((23 & 36) << 1) = 51 + 8
也就是把23
和36
的相加運算轉化為了51
和8
的相加運算,接下來繼續分析51
和8
的相加運算,也是通過互斥或和相與進行操作。
51 + 8 = (51 ^ 8) + ((51 & 8) << 1) = 59 + 0
嗯?可以發現我們已經得出59
了,而且還加了個0
,加了個0
不就相當於加了個寂寞嘛,可以直接省略啊。
由此,我們又可以得出一個結論,兩個數的二進位制進位資訊為兩個數的相與在左移一位,不停地迴圈這個過程,直到有一個數變為0,就能得到結果。
現在來總結下整體的計算過程:
經過上面的分析,來看下程式碼實現。
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); } }
執行程式,輸出結果為59。
還是以23
和36
為例,如果要計算 36 - 23
,該怎麼辦?
36 - 23
不就相當於36 + (-23)
,可以理解為加上一個負數,這就可以了嗎?不不不,要求的是不能出現加減符號,-23
裡面是有減法這個符號的。
還記得前面我們分析的負數可以怎麼表示嗎?對了,負數是對一個數的取反再加1。嗯?又出現加號了,不過加法我們不是已經實現了嗎?直接拿來用就好了。
有了加法操作,減法就很簡單了,來看下程式碼。
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); } }
執行一下輸出結果為13
。
嗯,Perfect!
本文主要介紹如何使用位運算來實現加減功能,至此功能都已經實現了。
那麼問題來了,我們實現的加減運算與Java本身的加減相比,誰的效率更高呢?當然是Java中的更高了,因為我們是用Java實現的,程式碼執行後,要經過層層的翻譯才能到達底層,所以效率肯定是有損失的。
當然我們的目的是熟悉位運算的操作,這個才是最重要的。
到此這篇關於Java利用位運算實現加減運算詳解的文章就介紹到這了,更多相關Java位運算實現加減運算內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45