题目来源: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 会对高位有一个进位
那么可以看出,对于不考虑进位的情况,直接使用 异或 运算即可
另外对于进位,可以使用 与 运算,然后再把得到的结果右移一位,即是对下一位的进位
那么算法过程可以分为:
- 初始时,将 a 与 b 的异或运算结果存入 a,将 a 与 b 的 与运算 结果 左移一位 后 存入 b
- 进行循环,若 b 不为 0(表示还有进位未处理)则重复第一步,直至进位为 0
- 将计算后的 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;
}

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

被折叠的 条评论
为什么被折叠?



