力扣 371. 两整数之和

这篇博客介绍了一种在不允许使用加减运算符的情况下,通过位运算计算两个整数之和的方法。主要思路是利用异或运算求不带进位的和,与运算求进位,并通过循环处理进位,直到没有进位为止。详细阐述了位运算在解决此类问题中的应用。

题目来源:https://leetcode-cn.com/problems/sum-of-two-integers/

大致题意:
给两个整数,不用加减号算出它们的和

思路

不能用加减那肯定就是位运算,自己想了下没想出来就看题解去了

位运算

负数的二进制在内存中是以补码(就是把负数对应的正数的二进制按位取反再 + 1 得到)的形式存在的,正数的补码就是原码
a - b,就是 a 的补码 对 b 的补码 直接进行加法就可以了

对于某一位的加法,有四种情况:

  • 0 + 0
  • 0 + 1
  • 1 + 0
  • 1 + 1

可以看到,对于某一位上的运算,只有当两位的值不一样时,结果才是 1,若都是 0 或者都是 1,该位运算结果是 0,不过都是 1 会对高位有一个进位

那么可以看出,对于不考虑进位的情况,直接使用 异或 运算即可

另外对于进位,可以使用 运算,然后再把得到的结果右移一位,即是对下一位的进位

那么算法过程可以分为:

  1. 初始时,将 a 与 b 的异或运算结果存入 a,将 a 与 b 的 与运算 结果 左移一位 后 存入 b
  2. 进行循环,若 b 不为 0(表示还有进位未处理)则重复第一步,直至进位为 0
  3. 将计算后的 a 返回

代码:

public int getSum(int a, int b) {
        while (b != 0) {    // 若还有进位、或者首次
            int carry = a & b;  // 求进位
            a = a ^ b;  // 求加上上次进位的和(首次是 a 与 b 不算进位的和)
            b = carry << 1; // 进位左移
        }
        return a;
    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三更鬼

谢谢老板!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值