演算法之道—-不用加,減, 乘 ,除 計算 a+b的值

來源:互聯網
上載者:User

 在面試筆試中會考到這類題目,要求不用加減乘除運算來計算兩數和,其實考的就是位元運算。

 

       規則1:

       如果1010+0101 = 1111在計算上不產生進位, 則1010^0101 = 1010+0101 = 1111   

     

      上面1010和 0101 二進位加法計算的特點是沒有進位,所以他們的二進位加法和按位異或運算結果才會相同。但是如果如果是二進位加法運算有進位,則明顯以上等價關係就不能成立。

 

       思路:如 20(10100)+25(11001)  =45二進位加法運算會產生進位,那我們把他轉換成a和b兩個數 滿足a+b = 20+25 = 45且a和b二進位加法不會產生進位,按照規則1有 20+25  = a + b = a ^ b,明顯我們可以找到一個例子 a=32(100000) b=13(001101)滿足上述要求。

 

       如何找到a 和 b:

當產生進位的時候,我們可以試著把產生進位的位置找出來, 20(10100)+25(11001) 進行按位與運算

10100&11001 = 10000  可知道在最高位是兩個1相與,故在最高位產生進位,10100^11001 = 01101這個結果是不進位的結果,只要我們把不進位的異或運算加上進位時候帶來的結果增量加起來,就是我們最終想要的結果10100+11001 = 101101 .

結果為:10100^11001+(10100&11001)<<1 =  01101+10000 <<1

a  =  01101

b =  10000 <<1 = 100000--->左移位後的結果即為進位產生的增量

 

如果a   b還不滿足上面思路中的要求的話,在繼續重複上面的過程,知道找出滿足思路中的啊a,b的值。

 

代碼如下:

 1  #include "stdio.h" 2 int bitAdd(int a ,int b){ 3     printf("第一次遞迴 bitAdd(%d ,%d )\n",a,b ); 4     int jin = a&b;//進位 5     int notJin = a^b; 6     if (jin!=0) 7     { 8         return bitAdd(jin<<1,notJin); 9     }else{10         return notJin;11     }12     return 0;13 }14  int main()15 {16     int a ,b;17     printf("輸入兩個數做加法(空格隔開)\n");18     scanf("%d %d",&a,&b);19     printf("結果:%d+%d=%d",a,b,bitAdd(a,b));20     return 0;21 }

 

 結果:

 

       

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.