位运算:二进制求和,求解《面试题 17.01. 不用加号的加法》和《剑指 Offer 65. 不用加减乘除做加法》

2022-04-17 23:48:16
位运算,用二进制求和,求解《面试题 17.01. 不用加号的加法》和《剑指 Offer 65. 不用加减乘除做加法》

位运算二进制求和的图示

二进制求和

模板

递归

function add(a, b) {
  if (b === 0) return a
  return add(a ^ b, (a & b) << 1)
}

迭代

function add(a, b) {
  while(b) {
    const t = a ^ b
    b = (a & b) << 1
    a = t
  }
  return a
}

例题

面试题 17.01. 不用加号的加法

剑指 Offer 65. 不用加减乘除做加法

设计一个函数把两个数字相加。不得使用 + 或者其他算术运算符。

答案

递归
var add = function(a, b) {
  if (b === 0) return a
  return add(a ^ b, (a & b) << 1)
};
func add(a int, b int) int {
  if b == 0 {
    return a
  }
  return add(a ^ b, (a & b) << 1)
}
class Solution {
    function add($a, $b) {
      if ($b === 0) return $a;
      return $this->add($a ^ $b, ($a & $b) << 1);
    }
}
迭代
var add = function(a, b) {
  while (b) {
    const t = a ^ b
    b = (a & b) << 1
    a = t
  }
  return a
};
func add(a int, b int) int {
  for b != 0 {
    t := a ^ b
    b = (a & b) << 1
    a = t
  }
  return a
}
class Solution {
    function add($a, $b) {
      while ($b) {
        $t = $a ^ $b;
        $b = ($a & $b) << 1;
        $a = $t;
      }
      return $a;
    }
}
位运算:求解《868. 二进制间距》
位运算,求解《868. 二进制间距》
Brian Kernighan 算法:求解《191. 位1的个数》《338. 比特位计数》《266. 回文排列》和《面试题 01.04. 回文排列》
Brian Kernighan 算法:用数组、哈希表、哈希集合 3 种数据结构求解《191. 位1的个数》《338. 比特位计数》《266. 回文排列》和《面试题 01.04. 回文排列》
位图(位集):求解《2166. 设计位集》
什么是位图(位集),求解《2166. 设计位集》