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

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

 

       規則1: java

       若是1010+0101 = 1111在計算上不產生進位, 則1010^0101 = 1010+0101 = 1111    面試

     

      上面1010和 0101 二進制加法計算的特色是沒有進位,因此他們的二進制加法和按位異或運算結果纔會相同。可是若是若是是二進制加法運算有進位,則明顯以上等價關係就不能成立。 app

 

       思路:如 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)知足上述要求。 spa

 

       如何找到a 和 b: 遞歸

當產生進位的時候,咱們能夠試着把產生進制的位置找出來, 20(10100)+25(11001) 進行按位與運算
ip

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

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

a  =  01101 io

b =  10000 <<1

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

 

代碼以下:

C代碼 
  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. }  

 結果:

相關文章
相關標籤/搜索