前言
这里的逻辑运算指的是二进制运算,如与、或、非、异或、同或等。
二进制运算
1)逻辑与,01 & 10 = 00;同时为1才得1,其它情况都为0;
2)逻辑或,01 | 10 = 11;同时为0才得0,其它情况都为1;
3)逻辑非,!01 = 10;属于按位取反;
4)异或,10 ^ 01 = 11;相异为1,相同为0;
5)左移,把二进制左移,010 << 1 = 100;
异或操作就像加法一样,但这是无进位加法。
逻辑与操作,两者都为1才为1,可作为进位的标志。
如何进位?不就是把前一位加1就表示进1位,把逻辑与操作的结果左移1位,再与原结果异或就实现给前一位做加1的操作。
注:此图来着leetcodeK神。
public int add(int a, int b) {
while(b != 0){
int c = (a & b) << 1;
a ^= b;
b =c;
}
return a;
}
总结
Q : 若数字 a 和 b 中有负数,则变成了减法,如何处理?
A : 在计算机系统中,数值一律用补码来表示和存储。补码的优势: 加法、减法可以统一处理(CPU只有加法器)。因此,以上方法同时适用于正数和负数的加法 。