写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
示例:
输入: a = 1, b = 1
输出: 2
提示:
- a, b 均可能是负数或 0
- 结果不会溢出 32 位整数
分析:
方法:位运算+进位
不能用加减乘除,显然只能用 位运算,两个二进制数进行加法,与加法最像的位运算就是 异或,异或 相同取 0,不同取 1,除了进位,就和普通二进制加法一样了,因此我们只需要知道进位的位置,而进位的情况就只有都为 1 时,与运算 只有都为 1 时取 1,正好满足,因此可以两数做与运算然后左移就是进位的数,进行异或运算后将被加数赋为进位的数继续进行操作,直到被加数为 0,此时的加数就是和。
时间复杂度:O(C) 0 <= C <= 32
空间复杂度:O(1)
class Solution {
public int add(int a, int b) {
//遍历,当b为0时退出
while(b != 0){
//进位
int temp = (a & b) << 1;
//a 与 b 相加,不管进位
a ^= b;
//b取进位
b = temp;
}
return a;
}
}
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof