A+B问题
一般来说,都是直接用a+b,那么在不能使用a+b的情况下呢?大家都会想到使用逻辑运算,提取a,b的每一位进行计算。
涉及到的知识点如下:
- 与运算&: 两个相应的二进制位都为1,则该位运算结果为1,否则为0;
- 或运算|: 两个相应的二进制位只要有一个1,则该位运算结果为1;
- 非/取反运算~: 顾名思义,0变为1,1变为0
- 异或运算^: 两个相应的二进制位相同为0,不同为1
- 左移运算<<: 高位丢弃,低位补0
- 右移运算>>: 将一个数的各个二进制位全部右移N位,无符号数高位补上0
思路:
使用a^b可以得到不进位的和,a&b可以得到是否进位,进位后再左移一位即可,即使用(a&b)<<1来考虑进位的情况。
只要进位不为0,那么就迭代,否则返回。
最终的结果=不进位的情况+进位的情况。
a + b=( a ^ b )+( (a & b) << 1)
代码如下:
#include<iostream>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
cout<<(a^b)+((a&b)<<1);
return 0;
}