异或运算

异或运算有以下三个性质。

任何数和 0做异或运算,结果仍然是原来的数
任何数和其自身做异或运算,结果是 0
异或运算满足交换律和结合律

加法

  1. 二进制位异或运算相当于对应位相加,不考虑进位
    比如: 1 ^ 1 = 0 —-> 1 + 1 = 0 (当前位值为0,进一位)
    1 ^ 0 = 1 —-> 1 + 0 = 1 (当前位值为1)
    0 ^ 0 = 0 —-> 0 + 0 = 0 (当前位值为0)

  2. 二进制位与运算相当于对应位相加之后的进位
    比如: 1 & 1 = 1 —-> 1 + 1 = 0 (当前位的值进一位)
    1 & 0 = 0 —-> 1 + 0 = 1 (当前位的值不进位)
    0 & 0 = 0 —-> 0 + 0 = 0 (当前位的值不进位)

  3. 两个数相加:对应二进制位相加的结果 + 进位的结果
    比如:3 + 2 —> 0011 + 0010
    0011 ^ 0010 = 0001
    0011 & 0010 = 0010 需要进位变成 0100 也就是<<1
    当进位之后的结果为0时,相加结束。

  1. func add(a int, b int) int {
  2. for b!=0{
  3. sum :=a^b
  4. carry :=(a&b)<<1
  5. a = sum
  6. b = carry
  7. }
  8. return a
  9. }