思想是:
两个数字相加分解成 :不进位的和 + 每一位相加的进位
困惑:
负整数运算也可以,因为补码运算,不存在减法。
所以反复迭代,一直到所有的进位为0
class Solution {
/**
A^B 表示A + B 中每位不进位的和,
(A&B) << 1 表示 A+B 表示每一位相加的进位
A,B 分别可取00,01,10,11.
组合位00与01, 00与10, 00与11, 01与10, 01与11, 10与11.
分析:
A: 0b01, B: 0b10, A^B = 0b11 A&B = 0b00
A: 0b01, B: 0b11, A^B = 0b10, A&B = 0b01
A: 0b10, B:0b11, A^B = 0b01, A&B = 0b10
*/
public int getSum(int a, int b) {
if (b ==0) {
return a;
}
int sumValue = a ^ b;
int carray = (a & b) << 1;
while (carray !=0 ) {
a = (sumValue ^ carray);
b = (sumValue & carray) << 1;
sumValue = a;
carray = b;
}
return sumValue;
}
}
基础:
1. 在处理整形数值时,可以直接对组成整形数值的各个位进行操作。可以使用屏蔽技术获得整数中的各个位。
位运算符包括:
& : “与”
| : ”或“
^ : “异或”
~ : “非”
& 和 | 运算符应用于布尔值,得到的结果也是布尔值。不按“短路”方式计算。即在得到结果之前,一定要计算两个操作数的值。
2. “>>” 将二进制位进行右移;“<<” 将二进制位进行左移;
当需要建立位模式屏蔽某些位时,右移位或左移位运算符十分方便。
int fourthBitFromRight = (n & (1<<3)) >> 3;
3. && 和 || 的运算按短路方式求值。
通过运用2 的幂次方的& 运算可以将其他位屏蔽掉,而只保留其中的某一位。
网友评论