LintCode-第一题:A+B problem (不用“+”等运算符)(位运算实现加法)
来源:互联网 发布:网络人身攻击怎么办 编辑:程序博客网 时间:2024/05/20 05:30
首先贴一张位运算表和优先级表:
逻辑运算是按位运算的,相邻位之间没有任何关系。
正确的说法是:对二进制数进行算术运算时,必须考虑进位和借位的处理;对二进制数进行逻辑运算时则不必考虑相邻位之间的关系。
首先肯定要想到用位运算来操作,即用二进制来处理,好,既然想到这里,当然要举个例子来想想,最简单的1+2
1的二进制 ····0001
2的二进制 ····0010
3的二进制 ····0011
那a+b不就等于a|b吗?那么,再来验证下1+3
1的二进制 ····0001
3的二进制 ····0011
4的二进制 ····0100
发现之前的猜想错误了,然后再经过一些其他简单的验算,我们会轻而易举的发现一个规律,如果没有进位,那么a+b = a|b 如果有进位就不成立。
所以接下来要处理进位的问题,我们在用1+3来研究下进位的问题,如果我们忽略有进位的位置后,再加上应该进位的位置,就是我们的值。
1的二进制(a) ····0001
3的二进制(b) ····0011
忽略进位的二进制(c) ····0010(忽略有进位的位),既然忽略了进位,那么接下来肯定要加上进位
应该进位的值(d) ····0010
我们的值应该是c+d(但是c和d还是有进位,那么再重复上述操作),即:
c的二进制 ····0010
d的二进制 ····0010
忽略进位的二进制(e) ····0000
应该进位的值(f) ····0100
结果就是e+f = 4
所以我们的整体过程应该是先计算a和b(忽略进位),相当于位运算符a^b,再计算应该进位的值,相当于位运算(a&b)<<1,再把两者相加,相当于位运算a|b(如果还有进位,那么重复前面两步,不能直接a|b),没有进位后,结果就是a|b(之前得出的结论,如果没有进位那么a+b = a|b)。
int aplusb(int a, int b) {if((a&b) == 0)return a|b;return aplusb(a^b,(a&b)<<1);}
递归调用
我们的计算机其实就是通过上述的位运算实现加法运算的(通过加法器,加法器就是使用上述的方法实现加法的),而程序语言中的+ - * /运算符只不过是呈现给程序员的操作工具,计算机底层实际操作的永远是形如0101的位,所以说位运算真的很重要!
- LintCode-第一题:A+B problem (不用“+”等运算符)(位运算实现加法)
- 面试算法题:不用+、-、×、÷数字运算符做加法 (位运算实现加法操作)
- 不用“+”运算符,实现A+B运算
- 1.A+B问题,不用+实现加法运算
- 不用加法操作符(+)实现加法运算
- 使用 & ^ << 等 位符实现加法运算
- 实现加法计算(不用加减乘除运算符)
- 不用 + -× /实现加法运算
- 不用+-*/实现加法运算
- 不用‘+’实现加法运算
- lintcode刷题 A + B 问题 位运算
- 【lintcode】1、A+B问题【位运算】
- [LintCode]1.A + B 问题 位运算
- 不用加减乘除写一个加法函数(位运算)
- [ctest]位运算实现加法(转)
- 位运算实现a+b
- 位运算实现加法
- 位运算实现加法
- 【2017.12.02】C组比赛总结
- LeetCode-27. Remove Element
- 使用线程来实现一个时间倒计时
- 读书笔记_MySQL必知必会
- 《kubernetes-1.8.0》15-addon-vSphere Cloud Provider
- LintCode-第一题:A+B problem (不用“+”等运算符)(位运算实现加法)
- Windows程序设计:直线绘制
- linux下yum使用本地光盘做为安装源
- 【Hive】hive-2.1.1内嵌模式安装配置全过程
- 集合类
- python数据类型
- python 3 爬虫获取可用ip地址(小白)
- Centos装MySQL5.6
- Linux学习7:文件系统操作与磁盘管理