1. 程式人生 > >實現一個add()函式-兩數相加(不能使用四則運算以及++--)

實現一個add()函式-兩數相加(不能使用四則運算以及++--)

當我們被問到這個問題時,都在想既然是兩數相加,那必然要使用到四則運算或者自增自減。

如果不用四則運算,那我們就要想想十進位制數之間是怎麼進行加法的。比如要計算14+7=21。我們可以通過三步來計算,(1)個位上進行加法計算得出4+7=11  (不進位)(2)4+7=11需要進位,進位的值為10  (3) 前兩步相加結果證號為:10+11=21

其實求兩數之和四則運算不能用,那就只剩下位運算了(位運算針對於二進位制數間操作)我們可以用位運算來走上述三步。4的二進位制為0100 ,7的二進位制為0111(1)不進位相加:0100+0111=0011  (第三位兩數都為1,相加結果為二進位制1000,但不進位所以為0)(2)進位值為1000  (3)前兩步相加1000+0011轉換成十進位制為11,所以上述三步也符合二進位制數相加。

所以我們可以用位運算來替換二進位制間加法。(1)0+1、1+0結果為1,0+0、1+1結果為0,這和異或(^)操作的結果一樣(2)0+1、1+0、0+0都不會產生進位,只有1+1會產生進位,所以我們可以通過位運算中的按位與(&)來判斷是否需要進位,進位完成後只要向左移動一位就行 (3)前兩步相加  ps:若該數中需要進位的不止一處,則可以不斷重複(1)(2)步驟,直到不再產生進位。

具體實現如下:

int add(int x,int y)
{
	int sum;
	int count;
	while(y != 0)
	{
		sum=x^y;
		count=(x&y)<<1;
		x=sum;
		y=count;
	}
	return x;
}
int main()
{
	int i,j,num;
	cin>>i>>j;
	num=add(i,j);
	cout<<num<<endl;
	system("pause");
	return 0;
}