不用任何算术运算符计算两个数的和

问题定义:

    写一个函数 int Add( int x, int y),计算两个整数的和,这个函数不能使用任何算术运算符(+, ++, --, -……等。)

分析:

    考虑只有一位的二进制,在这种情况下,有四种可能( 0 + 0, 1 + 0, 0 + 1, 1 + 1 ),我们可以把这四种可能分成两种情况,一种情况就是位相同(0 + 0, 1 + 1),一种情况就是位不相同(1 + 0, 0 + 1 ),对于位不相同的情况,我们只需要通过异或就能得到两个数的和( 0 ^ 1 = 1 ^ 0 = 1 ),对于位相同的情况,如果两个位都是0,则可以不计算,如果两个位都为1,则有进位产生(1 + 1 = 10),我们可以通过,先做与运算,然后再向左移一位来得到两个数的和。

求解:

    我们可以将上面的想法用到32位整型数据上,假设有两个数x和y,如果x和y的二进制表示法中,相同位置的位不同,则可以通过异或(^)得到两个数的和,如果x和y的二进制表示法中,相同位置上的数都为1,则有进位产生,可以通过先与,再左移一位得到。即(x&y) << 1 + x ^ y。

根据上面的分析,我们可以轻易写出下面的程序:

#include <stdio.h>

int Add( int x, int y)
{
	//Iterate till there is no carry
	while( y != 0 )
	{
		//carry now contains common set bits of x and y
		int carry = x & y;

		//Sum of bits of x and y where at least one of the bits is not set
		x = x ^ y;
	
		//Carry is shifted by one so that adding it to x geives the required sum
		y = carry << 1;
	}
	return x;
}
int main()
{
	printf("%d\n", Add(15, 32));
	return 0;
}

下面是该函数的递归实现:
int Add( int x, int y)
{
		if( y == 0 )
		{
				return x;
		}
		else
		{
				return Add( x ^ y, (x & y) << 1 );
		}
}

参考资料:

http://www.geeksforgeeks.org/archives/18324?utm_source=rss&utm_medium=rss&utm_campaign=add-two-numbers-without-using-arithmetic-operators


你可能感兴趣的:(不用任何算术运算符计算两个数的和)