371. 两整数之和
首先来看下Java和C语言的位运算表格:
含义 | C语言 | Java |
---|---|---|
按位与 | a & b | a & b |
按位或 | a | b | a | b |
按位异或 | a ^ b | a ^ b |
按位取反 | ~a | ~a |
左移 | a << b | a << b |
带符号右移 | a >> b | a >> b |
无符号右移 | a>>> b |
举个例子试试看,比如1 + 2,由于位运算都是基于二进制的也就是1 + 2 = (001) + (010),如果列竖式计算的话就是
0 0 1 + 0 1 0 ----------- 0 1 1
1 + 3 = (001) + (011),如果列竖式计算的话就是
0 0 1 + 0 1 1 ----------- 1 0 0
2 + 3 = (010) + (011),如果列竖式计算的话就是
0 1 0 + 0 1 1 ----------- 1 0 1
最低位如果是两个1相加则要进一,如果一个是1,一个是0,则不进位。然后在做第二位的运算,以此类推,一直到没有进位为止。当同一位上的数字都是1的时候需要进位,进位以后下一位变成1,也就是3 & 1中等于1的地方是需要进位的,然后左一一位,使下一位变成1, 然后下一位需要加的数字就是 3 ^ 1。具体的一些步骤,详见:https://blog.csdn.net/goskalrie/article/details/52796360
class Solution { public int getSum(int a, int b) { //位运算实现加减法 int res = 0; //不进位的加和 int xor = a^b; //进位和 int forward = (a&b)<<1; if(forward != 0){ res = getSum(xor,forward);//循环处理 进位和+不进位加和 }else { res = xor; } return res; } }
class Solution { public int getSum(int a, int b) { while(a != 0) { int tmp = (a & b) << 1; b = a ^ b; a = tmp; } return b; } }