问题定义:
写一个函数 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