一、题目
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
示例:
输入: a = 1, b = 1 输出: 2
提示:
a, b 均可能是负数或 0
结果不会溢出 32 位整数
二、思路
既然不能用加减乘除,则只能通过位运算了
位运算中,异或是最接近相加操作的,但是无法表示出进位的情况
通过举例我们可以发现
0 1 0 0
1 1 1 1
--------异或
1 0 1 1
0 1 0 0
1 1 1 1
---------与
0 1 0 0
与操作中中存在1的位置,恰好应该向前进一位
因此,我们可以将其这两个数相加转化为异或结果与与结果相加,知道与操作之后的结果为0;
class Solution {
public int add(int a, int b) {
//没有加减乘除,只能用位运算
//位运算可以直接对数值进行,不需要转化为二进制,这都是我们便于理解才转化的
//二进制包括:&与,|或,~非,^异或
int c = 0;
while(b!= 0){
c = (a&b)<<1;
a = a^b;
//此时转化为c与a相加
b = c;
}
return a;
}
}