剑指offer - 不用加减乘除做加法(Java实现)
如图:先看一下 6 + 4 = 10 的二进制运算:
首先可以看出,前 n 位我们在进行加操作的时候相当于按位异或运算(相同为 0, 不同为 1),考虑完了这个问题以后我们就可以考虑此时的进位情况,产生进位的情况有:两个都为 1,相当于按位与操作以后得到了一个 1,然后将这个 1 左移一位就是其前面一位的进位,然后再将按位异或得到的结果与得到的进位情况得到异或运算,直到没有进位产生了为止。由于在计算机中负数是以补码的形式存储的,所以我们在计算负数相加的时候也可以模拟这个过程(无符号整型)。
public class Solution { public int Add(int num1,int num2) { while(num2 != 0) { int val = (num1 & num2) << 1; num1 ^= num2; num2 = val; } return num1; } }
【剑指offer】题目全解 文章被收录于专栏
本专栏主要是刷剑指offer的题解记录