a+b等于几——高级解法
码文不易,如果帮助到您,希望您可以下载一个压缩包,与您无害,与我有益谢谢支持原创
欢迎大家阅读我的博客,如果有错误请指正,有问题请提问,我会尽我全力改正错误回答问题。在次谢谢大家。
实验环境
- 语言c/c++
- 编译器devc++5.11/5.40
实验内容与要求
给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。
说明
a和b都是 32位 整数么?
是的
我可以使用位运算符么?
当然可以
样例
如果 a=1 并且 b=2,返回3
目录
码文不易,如果帮助到您,希望您可以下载一个压缩包,与您无害,与我有益谢谢支持原创
实验解析
思路
前言
简单方法确实想着简单,但是做起来还是分类挺多的,我们再来探究一下更简便的方法
不相同
高级方法
二进制四种情况运算结果对比:
a | b | 与 | 异或 | 进位加法 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 00 |
1 | 0 | 0 | 1 | 01 |
0 | 1 | 0 | 1 | 01 |
1 | 1 | 1 | 0 | 10 |
大家有没有看出些什么?与运算表示进位,异或运算表示原位
那么现在不用再一位一位运算了,可以整体与向右移位后加上异或结果,这里可以运用递归。
函数说明
递归计算方法
int calculate(int a,int b){
int sum =0,carry=0;
if(a==0){
return b;
}
if(b==0){
return a;
}
sum = a^b;
carry = a&b;
carry = carry<<1; //左移
return calculate(sum,carry);
}
非递归计算方法
int calculate(int a,int b){
int sum =0,carry=0;
while(true) {
if(a==0){
return b;
}
if(b==0){
return a;
}
sum = a^b;
carry = a&b;
carry = carry<<1;
a = sum;
b = carry;
}
}
主函数
main(){
int a,b;
cin>>a>>b;
cout<<calculate(a,b)<<endl;
}
结果展示
附录
相关资料
源代码
递归解法
#include <iostream>
using namespace std;
int calculate(int a,int b);
main(){
int a,b;
cin>>a>>b;
cout<<calculate(a,b)<<endl;
}
int calculate(int a,int b){
int sum =0,carry=0;
if(a==0){
return b;
}
if(b==0){
return a;
}
sum = a^b;
carry = a&b;
carry = carry<<1;
return calculate(sum,carry);
}
非递归解法
#include <iostream>
using namespace std;
int calculate(int a,int b);
main(){
int a,b;
cin>>a>>b;
cout<<calculate(a,b)<<endl;
}
int calculate(int a,int b){
int sum =0,carry=0;
while(true) {
if(a==0){
return b;
}
if(b==0){
return a;
}
sum = a^b;
carry = a&b;
carry = carry<<1;
a = sum;
b = carry;
}
}
码文不易,如果帮助到您,希望您可以下载一个压缩包,与您无害,与我有益谢谢支持原创