您的位置:首页 > 编程语言 > C语言/C++

a+b等于几(不用+)

2017-12-19 13:38 176 查看

a+b等于几

码文不易,如果帮助到您,希望您可以下载一个压缩包,与您无害,与我有益谢谢支持原创

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

  肯定有童鞋说,a+b不就等于a+b么。。。还能怎么算?那便来看一看,我新学到的方法吧!

码文不易,如果帮助到您,希望您可以下载一个压缩包,与您无害,与我有益谢谢支持原创

实验环境

语言c/c++

编译器devc++5.11/5.40

实验内容与要求

给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。

说明
a和b都是 32位 整数么?
是的

我可以使用位运算符么?
当然可以

样例
如果 a=1 并且 b=2,返回3


目录

a+b等于几
实验环境

实验内容与要求

目录

实验解析
知识点
逻辑运算(位运算符)

思路
前言

初级方法

高级方法

函数说明
计算方法

主函数

结果展示

附录
相关资料

源代码
初级方法

码文不易,如果帮助到您,希望您可以下载一个压缩包,与您无害,与我有益谢谢支持原创

实验解析

知识点

逻辑运算(位运算符)

运算名称运算符号运算描述
&如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
|两个相应的二进制位中只要有一个为1,该位的结果值为1
非(取反)~~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
异或^若参加运算的两个二进制位值相同则为0,否则为1
左移<<用来将一个数的各二进制位全部左移N位,右补0
右移>>将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0

思路

前言

  我的第一想法当然是直接return a+b;嘿嘿;然而,我上网一搜,大神是真不少。

不相同

初级方法

一位一位进行比较,分类讨论。

abc1(进位)c2(结果)
0000
1001
0011
1111
1100
0101
1001
0000
那么现在:

从a取最后一位x,从b取最后一位y

x&c1&y等于一则进位位c1设为1,原位c2为1

x&c1&y不等于一,x&c1 || c1&y || x&y 等于一则进位位c1设为1,原位c2为0

x&c1&y不等于一,x|c1|y 不等于一 则进位位c1设为0,原位c2为0

x&c1&y不等于一,x|c1|y 等于一 则进位位c1设为0,原位c2为1

循环这些操作,记录每次的c2 ,就是a+b的结果

高级方法

高级方法

函数说明

计算方法

int calculate(int a,int b){
int a1, b1,c1,c2=0,c11=0,c21;//c1进位
c1 = 0;
c21 = 0 ;
if(a==0){
return b;
}
if(b==0){
return a;
}
for(int i = 0;i< 32 ;i++){
a1 = a&1;
b1 = b&1;
if(a1&b1&c11==1){
c11 = 1;
c21 = 1;
}else if(a1&b1|a1&c11|b1&c11){
c11 = 1;
c21 = 0;
}else if(a1|b1|c11){
c11 = 0;
c21 = 1;
}else{
c11 = 0;
c21 = 0;
}
c1 = c1|(c11<<i);
c2 = c2|(c21<<i);

a = a>>1;
b = b>>1;

}
return c2;
}


主函数

main(){
int a,b;
cin>>a>>b;
cout<<calculate(a,b)<<endl;
}


结果展示



附录

相关资料

参考资料

c语言逻辑运算符

源代码

初级方法

#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 a1, b1,c2=0,c11=0,c21;//c11进位位,c21当位结果
c21 = 0 ;
if(a==0){
return b;
}
if(b==0){
return a;
}
for(int i = 0;i< 32 ;i++){
a1 = a&1;
b1 = b&1;
if(a1&b1&c11==1){
c11 = 1;
c21 = 1;
}else if(a1&b1|a1&c11|b1&c11){
c11 = 1;
c21 = 0;
}else if(a1|b1|c11){
c11 = 0;
c21 = 1;
}else{
c11 = 0;
c21 = 0;
}
c1 = c1|(c11<<i);
c2 = c2|(c21<<i);

a = a>>1;
b = b>>1;

}
return c2;
}


码文不易,如果帮助到您,希望您可以下载一个压缩包,与您无害,与我有益谢谢支持原创
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息