A + B 问题:给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。
举两个例子
例子一: 整数 5 和 整数 17
例子二: 整数 20 和 整数 2
异或运算的运算方式 是二进制 0 ^ 0 = 0 , 1 ^ 1 = 0 , 0 ^ 1 = 1 , 1 ^ 0 = 1 ; 异或运算 是忽略进位的 加法
与运算的运算方式 是二进制 0 & 0 = 0 , 1 & 1 = 1, 0 & 1 = 0 , 1 & 0 = 0 ; 与运算是为了计算进位的 结果。
例如 结果 0001 << 1 = 0010 = 2(十进制) ,当进位结果左移一位 仍然是 0000 0000 时 ,意味加法无进位。
解题步骤 :
1. 二进制 5 和 二进制 17 进行 异或运算(^),忽略进位。得出 结果 x1 。含义是 二进制异或运算 计算两个二进制忽略 进位的加法结果。
2. 二进制 5 和 二进制 17 进行 与运算(&),得出结果 再 向左移一位 , 得出结果 x2。 含义是 二进制与运算 计算出 两个二进制数相加 是否出现进位 现象
3. 将结果x1和结果x2相加 就是 两个整数相加的结果。
/* * 给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。 */ #includeint aplusb(int a, int b) { if(a==0)return b; if(b==0)return a; int x1 = a^b; int x2 = (a&b)<<1; return aplusb(x1,x2); } int main() { int a=5,b=10; int result = aplusb(a, b); printf("两个数相加 %d + %d = %d ",a,b,result); printf("\n"); return 0; }