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;嘿嘿;然而,我上网一搜,大神是真不少。不相同
初级方法
一位一位进行比较,分类讨论。a | b | c1(进位) | c2(结果) |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 |
0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 |
1 | 1 | 0 | 0 |
0 | 1 | 0 | 1 |
1 | 0 | 0 | 1 |
0 | 0 | 0 | 0 |
从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; }
码文不易,如果帮助到您,希望您可以下载一个压缩包,与您无害,与我有益谢谢支持原创
相关文章推荐
- 六、初学Java多线程:慎重使用volatile关键字(看完感觉是不是就等于不用?)
- a+b等于几(不用+)高级解法
- Winpcap打开适配器并捕获数据包:不用回调方法捕获数据包
- zzulioj 1841: so easy!麻麻再也不用担心我的数学了! (数学规律)
- MongoDB中的日期查询命令的记录:大于、小于、等于、范围内、(mongoVUE 操作记录)
- ssh 不用输入密码
- 用CSS3实现带小三角形的div框(不用图片)
- 删除null的列是is不是等于号
- int 转 string 输出 (不用库函数)
- TortoiseGit连接github不用每次输入用户名和密码的方法
- MATLAB 控制台显示(不用disp函数进行显示)
- TextView 不用 ScrollViewe 也可以滚动
- kettle生成100个随机数,并统计小于等于50和大于50个数
- 将两个字符串连起来,不用strcat函数,新手版
- 在数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数
- 原来的账号不用了。
- Javascript中两个等于号和三个等于号的区别(==/===)
- C语言 不用循环,输出1到1000
- 世界 500 强坚决不用的 13 种人
- javascript 之谜系列:为什么 [1,2] + [3,4] 不等于 [1,2,3,4]?