371. Sum of Two Integers

来源:互联网 发布:qq飞车暗夜黄蜂数据 编辑:程序博客网 时间:2024/06/06 06:56

Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.

Example:
Given a = 1 and b = 2, return 3.

不使用“+”、“-”号进行加法运算。
思路:在比特位上模拟进制运算,1和1进位1,1和0(0和1)

位运算的基本知识:
&:与运算,两位都为1时,结果才为1
|:或运算,两位都为0时,结果才为0
^:异或,两位相同为0,相异为1
~:取反,0变为1,1变为0
<<:左移,全部位向左移动若干位,高位丢弃,低位补0

:右移,各二进制位全部右移若干位,对无符号位,高位补0,有符号位,各编译器处理的方法不同。

public static int getSum(int a, int b) {        //不运用+、- ,计算两个数的和        if(a == 0){            return b;        }        if(b == 0){            return a;        }        while(b != 0){            int temp = a & b;            a = a ^ b;            b = temp << 1;        }        return a;    }

1.首先计算需要进位的全部位(a&b),假设a =1 = 0001,b = 3 = 0011,那么a&b = 0001,也就是说第一位需要进位,这时候<<1,左移1位,下一个循环参加运算的a就成了0010,a = 0010
2.b = a ^ b,将a中无关进位的位正常加起来,b = 0001 ^ 0011 = 0010
3.a换成之前保存的需要进位的temp,a == temp == 0010 != 0,那就说明还有需要前进的位。

a == 0010 != 0,下一次循环:
temp = (a&b)<<1 = 0100
b = 0000
a = 0100
a == 0100 != 0,继续循环:
temp = 0000
b = 0100
a = 0000
结束循环