--- title: "不用加减乘除做加法" created: 2025-11-28 tags: - 算法 --- # 不用加减乘除做加法 ## 题目 [不用加减乘除做加法](https://www.acwing.com/problem/content/description/81/) ![[image-f241e225.png]] ## 思路分析 ![[image-02898d3c.png]] 不让用加减乘除 那就考虑位运算 十进制加法转换成二进制再做加法 结果是一样的 之前有一个-x=~x+1 但也只是能做到将a+b变成a--b 还是要用减法 那么换一个角度思考 模拟一下计算 手写加法的时候 不外乎就是做两件事 算两位的和 再看上一位有没有进位 再加上去 $a{i}$*+* $b{i}$ + 进位 那不妨把拆开来 先算 $a{i}$*+* $b{i}$ 之后再考虑进位 对于二进制来说 $a{i}$*+* $b{i}$ 相当于$a{i}$*^* $b{i}$ 相同为0 不同为1 0+0=0^0=0 0+1=0^1=1 1+0=1^0=1 1+1=1^1=1 所以不考虑进位的加法直接就是 $a{i}$*^* $b{i}$ 那么进位怎么办 只有1 1的时候才会进位吧 进位进的是1 那么要1 1得1 显然是& 但是这个进位应该是进在下一位 所以于$a{i}$*&* $b{i}$ << 1 ok 这样一来 $a{i} $ $b{i}$ 进位 就都有了 ![[image-97b32f30.png]] ## 代码实现 ```java class Solution { public: int add(int num1, int num2){ while(num2) { int sum=num1^num2; int carry=(num1 & num2)<<1; num1=sum,num2=carry; } return num1; } }; ``` ## 同类题型 ## 视频讲解 --- ⬅️ [[2-Learning/02-算法/03-刷题理模型/位运算相关问题/位运算|位运算]] 🏠 [[00-刷题理模型]] ➡️ [[中等计算|中等计算]]