两整数之和

位运算 + 迭代计算每一位

  1. 解题思路:

    • 从低位往高位进行处理,处理过程中使用变量 add 记录进位信息;
    • 由于长度为 32 的二进制,所以循环 32 次,每次取 a、b 第 i 位的值 u1、u2;
    • 记录进位信息:add = u1 + u2 + add > 1 ? 1 : 0;
    • res 记录相加的结果:res |= (u1 ^ u2 ^ add) << i;
  2. 复杂度:

    • 时间复杂度:O©,C 为常数,固定为 32;
    • 空间复杂度:O(1);
  3. 代码实现:

    function getSum(a: number, b: number): number {
      let res = 0, add = 0; // 进位
    
      for (let i = 0; i < 32; i++) {
        // 获取 a、b 二进制位第 i 位的值
        let u1 = (a >> i) & 1, u2 = (b >> i) & 1;
    
        res |= (u1 ^ u2 ^ add) << i;
    
        // 判断是否进位
        add = u1 + u2 + add > 1 ? 1 : 0;
      }
    
      return res;
    };
    

无进位相加 + 获取进位

  1. 解题思路:

    • a ^ b 是无进位的相加;
    • a & b 结果左移一位即可得到进位;
    • 无进位的加法再加上进位就等于两个数相加,让无进位相加的结果与进位不断的异或,直到进位为 0;
  2. 复杂度:

    • 时间复杂度:O©,C 为常数,固定为 32;
    • 空间复杂度:O(1);
  3. 代码实现:

    function getSum(a: number, b: number): number {
      // 进位为 0,循环终止
      while (b != 0) {
        // 相与为了让进位显现出来
        const carry = (a & b) << 1;
    
        // 异或这里可看做是无进位相加
        // 让无进位相加的结果与进位不断的异或,直到进位为0
        a = a ^ b;
        b = carry;
      }
    
      return a;
    };
    

无进位相加 + 递归

  1. 复杂度:

    • 时间复杂度:O©,C 为常数,固定为 32;
    • 空间复杂度:O(1);
  2. 代码实现:

    function getSum(a: number, b: number): number {
      // a = (a & b) << 1; 进位
      // b = a ^ b; 无进位相加
      return a == 0 ? b : getSum((a & b) << 1, a ^ b);
    };
    
打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 两整数之和
  2. 2. 位运算 + 迭代计算每一位
  3. 3. 无进位相加 + 获取进位
  4. 4. 无进位相加 + 递归