绪论
挺长时间没更新了,但是文章停了,学习却从未停止,今天分享一下另类加法的解题案例。
一:题目
设计一个函数把两个数字相加。不得使用 + 或者其他算术运算符。
leetcode 链接:力扣
这是个简单题,不让用“+”号,那么首当其冲想到位运算,但是对位运算不熟悉的话可能也不太好做。
思路如下:A^B的值是A和B相加的每一位上不考虑进位情况下的值,那么进位的话可以用A&B得出,但是加法的话,每一位的进位是需要加到下一位的,将其向左移一位,再与A^B相加即为答案,那么题目又转化为 (A^B)和(A&B<<1)的和,不考虑用“+”的情况下。
这里可以剪枝,也就是当A&B==0的时候,A^B即为所求,具体代码如下:
class Solution {
public int add(int a, int b) {
//carry表示进位,将其向左移动一位和ans相加就是答案
//这里一直加到进位为0,返回答案
int ans = a^b;
int carry = a&b;
while (carry!=0){
carry=carry<<1;
int cur =ans;
ans=ans^carry;
carry=carry&cur;
}
return ans;
}
}
不理解的朋友可以自己画个二进制图来理解下,归根结底就是来回的将ans和carry相加,利用进位为零时,两数异或的值就是二者相加的性质来得出答案。
以上是今天分享