對於二進制的加法運算,若不考慮進位,則1+1=0,1+0=1,0+1=1,0+0=0,通過對比異或,不難發現,此方法與異或運算類似。因而排出進位,加法可用異或來實現。然后考慮進位,0+0進位為0,1+0進位為1,0+1進位為0,1+1進位為1,該操作與位運算的&操作相似。
那么加法運算可以這樣實現:
1)先不考慮進位,按位計算各位累加(用異或實現),得到值a;
2)然后在考慮進位,並將進位的值左移,得值b,若b為0,則a就是加法運算的結果,若b不為0,則a+b即得結果(遞歸調用該函數)。
算法代碼如下(非vs平台):
1 int bitAdd(int a,int b) 2 { 3 if(b==0) 4 return a; 5 int sum = a^b; 6 int carry =(a&b)<<1; 7 return bitAdd(sum,carry); 8 }
技巧題:實現1+2+3+4+……+n的值。
假設n=100;在vs平台下的代碼為:
1 #include <stdio.h> 2 #include<stdlib.h> 3 int bitAdd(int a,int b) 4 { 5 int sum=0,carry=0; 6 if(b==0) 7 return a; 8 sum = a^b; 9 carry =(a&b)<<1; 10 return bitAdd(sum,carry); 11 } 12 13 int main() 14 { 15 int i,sum=0 ,n = 100; 16 for (i = 1;i<=n ;i++ ) 17 { 18 sum = bitAdd(sum,i); 19 } 20 printf("1+2+3+…+%d = %d\n",n,sum); 21 system("pause"); 22 return 0; 23 }
運行結果為:
程序運行正確。