题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
题目分析
-
不用加减乘除四则运算符号,那就只能通过逻辑操作来完成加法了,也就是通过位运算
-
众所周知,计算机中整数时通过补码存的,如果是整数,那么
原码=反码=补码
;如果是负数,则补码=反码+1
-
如果要通过位运算来操作,首先要将数字转换成二进制,然后再通过逻辑运算来完成加法运算
-
一位加法
-
也就是执行加法
x ^ y
;进位操作(x & y) << 1
-
那二位加法呢?
-
一次类推,三位加法
解法分析
- 首先按照没进位计算,得出结果,判断进位是否为
0
- 如果进位是
0
,那就下一次计算就是计算进位和无进位结果的和 - 直到进位为
0
为止
代码
public class Solution {
public int Add(int num1,int num2) {
int result = 0;
int carry = 0;
do{
result = num1 ^ num2; //不带进位的加法 异或操作
carry = (num1 & num2) << 1; //进位
num1 = result;
num2 = carry;
}while(carry != 0); // 进位不为0则继续执行加法处理进位
return result;
}
}
// 例如计算 6+13
// 输出结果
result 11
进位 8
result 3
进位 16
result 19
进位 0
参考自题解:https://blog.nowcoder.net/n/07f2bd03162d40ddaebefd666e0d71b2?f=comment