1. 程式人生 > >利用位運算實現兩個整數的加法運算,請程式碼實現,並作簡要說明。

利用位運算實現兩個整數的加法運算,請程式碼實現,並作簡要說明。

#include <stdio.h>  
  
int main(void) {   
    int add(int a,int b);  
    int m,a,b;  
    scanf("%d,%d",&a,&b);  
    m = add(a,b);  
    printf("m=%d",m);  
    return 0;  
}  




int add(int a,int b){  
    if(b == 0) return a;//沒有進位時,完成運算,a為最終和。  
    int sum,carry;  
    sum = a ^ b;//沒有進位的加法運算  
    carry = (a & b) << 1;//進位,左移運算。  
    return add(sum , carry);//遞迴,相加。  
}  

/* *  x ^ y :實現不進位的加法,那麼我們接下來就要將進位的資料加上,就可以實現了。 *  x & y : 這個操作,即是找出相同位,為什麼我們需要找出相同的位呢,因為只 1 & 1 ,這種情況才會*  *  產生進位,可能有人會想那 0 & 0 呢,這個沒有影響的吧。 *  (x & y) << 1:為什麼要左移呢,其實也很簡單,即然後我們都已經找出需要進位的位,那麼說明在該位  *  置的前面一位,應該加上1,對吧,所以應該左移1位,就加上餘數 */ /*
首先 a&b是兩個數字中相同位與的結果,所以對待兩個數字都為0的話,則與的結果是0,

如果兩個數字是1的話與的結果是1,因此可以看出與的結果是兩個數字相同位做加法運算的一半,

a^b則是兩個數字相異位的加法運算之後

因此 ((a&b)<<1)+(a^b) 則為兩者之和
*/

連結:https://www.nowcoder.com/questionTerminal/f0925bdc2bb9430f8c6323f635e3f1b4
來源:牛客網

觀察加法運算,把兩個整數轉化為2進位制以後,1只有跟1相加的時候才為0,1和0相加是1,0和0相加也為0,所以聯想到異或操作可以得到這個值,然後進位的話只有1和1相加有進位,就可以用位與實現。每次的進位左移一位,知道進位消失