题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
练习地址
lc
实现
-
解法发现:无进位和 与 异或运算 规律相同,进位 和 与运算规律相同(并需左移一位)。因此,无进位和 n 与进位 c 的计算公式如下;
(和 s )==(非进位和 n )++(进位 c )
s=a+b⇒s=n+c
循环求 nn 和 cc ,直至进位 c = 0c=0 ;此时 s = ns=n ,返回 nn 即可。 -
时间复杂度
时间复杂度 O(1)
空间复杂度 O(1)
// (和 s )==(非进位和 n )+(进位 c )
public int add(int a, int b) {
while (b != 0) {
int c = (a & b) << 1; // c进位
a ^= b; // a存储非进位和
b = c; // b存储进位的值
}
return a;
}
jz:
-
方法:三步走
eg:5+17=22 5-0000 0101 22-0001 0001
第一步,各位相加不进位,05 17十位:各位|0+1=1:5+7=2,即12
第二步,进位,5+7有进位,值为10
第三步,前两步结果相加,12+10=22 -
二进制:
5–101,17–10001
第一步:异或
第二步:位与,左移1位
第三步:相加,直到不产生进位
public class C65_num_Add {
public static int getAdd(int num1, int num2) {
int sum, carry;
do {
sum = num1 ^ num2;
carry = (num1 & num2) << 1;
num1 = sum;
num2 = carry;
} while (num2 != 0);
return num1;
}
}
Test
public static void main(String[] args) {
int num1 = 5;
int num2 = 17;
System.out.println(getAdd(num1, num2));
}