a+b等于几(不用+)高级解法

来源:互联网 发布:网络等级保护 编辑:程序博客网 时间:2024/04/29 06:20

a+b等于几——高级解法


  欢迎大家阅读我的博客,如果有错误请指正,有问题请提问,我会尽我全力改正错误回答问题。在次谢谢大家。
  

实验环境


  • 语言c/c++
  • 编译器devc++5.11/5.40


实验内容与要求


给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。说明a和b都是 32位 整数么?是的我可以使用位运算符么?当然可以样例如果 a=1 并且 b=2,返回3


目录


  • ab等于几高级解法
    • 实验环境
    • 实验内容与要求
  • 目录
  • 实验解析
    • 思路
      • 前言
      • 高级方法
        • 二进制四种情况运算结果对比
    • 函数说明
      • 递归计算方法
      • 非递归计算方法
      • 主函数
    • 结果展示
  • 附录
    • 相关资料
    • 源代码
      • 递归解法
      • 非递归解法


实验解析

思路


前言

  简单方法确实想着简单,但是做起来还是分类挺多的,我们再来探究一下更简便的方法
不相同

初级解法

高级方法

二进制四种情况运算结果对比:

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; } 


结果展示


结果测试


附录

相关资料

  1. 参考资料


源代码


递归解法

#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;    }}
原创粉丝点击