c語言中用位元運算實現加法技巧介紹

來源:互聯網
上載者:User

用位元運算實現加法也就是電腦用二進位進行運算,32位的CPU只能表示32位內的數,這裡先用1位元的加法來進行,在不考慮進位的基礎上,如下

複製代碼 代碼如下:1 + 1 = 0
1 + 0 = 1
0 + 1 = 1
0 + 0 = 0

很明顯這幾個運算式可以用位元運算的“^”來代替,如下 複製代碼 代碼如下:1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0

這樣我們就完成了簡單的一位元加法,那麼要進行二位的加法,這個方法可行不可行呢?肯定是不行的,矛盾就在於,如何去
擷取進位?要擷取進位我們可以如下思考: 複製代碼 代碼如下:0 + 0 = 0
1 + 0 = 0
0 + 1 = 0
1 + 1 = 1

//換個角度看就是這樣 複製代碼 代碼如下:0 & 0 = 不進位
1 & 0 = 不進位
0 & 1 = 不進位
1 & 1 = 進位

正好,在位元運算中,我們用“<<”表示向左移動一位,也就是“進位”。那麼我們就可以得到如下的運算式 複製代碼 代碼如下://進位可以用如下表示:
(x&y)<<1

到這裡,我們基本上擁有了這樣兩個運算式 複製代碼 代碼如下:x^y //執行加法
(x&y)<<1 //進位操作

我們來做個2位元的加法,在不考慮進位的情況下 複製代碼 代碼如下:11+01 = 100 // 本來的演算法
// 用推算的運算式計算
11 ^ 01 = 10
(11 & 01) << 1 = 10
//到這裡 我們用普通的加法去運算這兩個數的時候就可以得到 10 + 10 = 100
//但是我們不需要加法,所以要想別的方法,如果讓兩個數再按剛才的演算法計算一次呢
10 ^ 10 = 00
(10 & 10) << 1 = 100

到這裡基本上就得出結論了,其實後面的那個 “00” 已經不用再去計算了,因為第一個運算式就已經算出了結果。
繼續推理可以得出三位元的加法只需重複的計算三次得到第一個運算式的值就是計算出來的結果。
c代碼如下: 複製代碼 代碼如下:int Add(int a,int b)
{
int jw=a&b;
int jg=a^b;
while(jw)
{
int t_a=jg;
int t_b=jw<<1;
jw=t_a&t_b;
jg=t_a^t_b;
}
return jg;
}

電腦本質是二進位運算,許多高人和天書都展示了如何用位元運算來實現讓人糾結卻又驚奇的事情。在豆瓣上看到一篇日誌描述如何用位元運算實現乘法,其實問題解決的關鍵是如何用位元運算實現加法。覺得原文敘述不夠精確,現總結如下。
定理1:設a,b為兩個位元,則a+b = a^b + (a&b)<<1。
證明:a^b是不考慮進位時加法結果。當二進位位同時為1時,才有進位,因此 (a&b)<<1是進位產生的值,稱為進位補償。將兩者相加便是完整加法結果。
定理2:使用定理1可以實現只用位元運算進行加法運算。
證明:利用定理1中的等式不停對自身進行迭代。每迭代一次,進位補償右邊就多一位0,因此最多需要加數二進位位長度次迭代,進位補償就變為0,這時運算結束。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.