异或运算
异或运算有以下三个性质。
任何数和 0做异或运算,结果仍然是原来的数
任何数和其自身做异或运算,结果是 0
异或运算满足交换律和结合律
加法
二进制位异或运算相当于对应位相加,不考虑进位
比如: 1 ^ 1 = 0 —-> 1 + 1 = 0 (当前位值为0,进一位)
1 ^ 0 = 1 —-> 1 + 0 = 1 (当前位值为1)
0 ^ 0 = 0 —-> 0 + 0 = 0 (当前位值为0)二进制位与运算相当于对应位相加之后的进位
比如: 1 & 1 = 1 —-> 1 + 1 = 0 (当前位的值进一位)
1 & 0 = 0 —-> 1 + 0 = 1 (当前位的值不进位)
0 & 0 = 0 —-> 0 + 0 = 0 (当前位的值不进位)两个数相加:对应二进制位相加的结果 + 进位的结果
比如:3 + 2 —> 0011 + 0010
0011 ^ 0010 = 0001
0011 & 0010 = 0010 需要进位变成 0100 也就是<<1
当进位之后的结果为0时,相加结束。
func add(a int, b int) int {
for b!=0{
sum :=a^b
carry :=(a&b)<<1
a = sum
b = carry
}
return a
}