算法实战(二)--求加法
2016-07-14 13:52
316 查看
书接上回,这回的题目是求加法;
说白了就是让你自己去实现加法,因为不予许用+,-号啊亲;
这道题考点在于你对位运算的掌握,实际上二进制的加减乘除都是位运算,我想大家都会想到用位运算实现,但这题有个误区就是—不要想的太复杂;
位运算符号最基础的几个符号:&(与),|(或),~(非),^(异或),>>\<<(左右位移);
然后我们说一下“+”怎么用位运算实现:
首先,我们考虑最原始的问题1 + 1(二进制的情况):
例子:
0 + 0 0 + 1 1 + 1
00 00 01
00 01 01
——————
00 01 10
我们很清楚的得出这个结论(在 1 + 1的情况):
这个结论我们验证过后发现没毛病,但是题目要求是不能用“+”啊!
很简单:
a + b = a^b + (a&b)<<1;
当a&b为0的时候,就变成了:
a + b = a^b(答案揭晓了)。
那么代码也来了:
我们已经,实现了求加法,同样如果求减法的话:
说白了就是让你自己去实现加法,因为不予许用+,-号啊亲;
这道题考点在于你对位运算的掌握,实际上二进制的加减乘除都是位运算,我想大家都会想到用位运算实现,但这题有个误区就是—不要想的太复杂;
位运算符号最基础的几个符号:&(与),|(或),~(非),^(异或),>>\<<(左右位移);
然后我们说一下“+”怎么用位运算实现:
首先,我们考虑最原始的问题1 + 1(二进制的情况):
例子:
0 + 0 0 + 1 1 + 1
00 00 01
00 01 01
——————
00 01 10
我们很清楚的得出这个结论(在 1 + 1的情况):
a^b ; //第一位的结果 (a&b)<<1; //第二位的结果 a+b == a^b + (a&b)<<1;
这个结论我们验证过后发现没毛病,但是题目要求是不能用“+”啊!
很简单:
a + b = a^b + (a&b)<<1;
当a&b为0的时候,就变成了:
a + b = a^b(答案揭晓了)。
那么代码也来了:
int sum(int a, int b) { int _and = a&b; int _xor = a^b; int t_a, t_b, _sum; if(_and == 0) { return _xor; } else { t_a = _xor; t_b = _and<<1; _sum = sum(t_a, t_b); } return _sum; }
我们已经,实现了求加法,同样如果求减法的话:
int sub(a,b) { return sum(a, ~b);//举一反三,亲; }
相关文章推荐
- JS+H5实现微信的摇一摇功能
- HDU 2204 Eddy's 爱好(容斥原理、给定n求满足p=m^k <= n的p的个数)
- Intent详解
- 欢迎使用CSDN-markdown编辑器
- ios developer tiny share-20160714
- ios developer tiny share-20160714
- Maven多模块布局实例详解
- .htaccess 基础教程(四)Apache RewriteCond 规则参数
- .htaccess 基础教程(三)RewriteCond标志符,RewriteRule适用的标志符
- 最常用App开发工具更新总结
- NOI 2001 & poj 1185 && NYOJ 85 炮兵阵地(状压dp)
- 基于策略的双出口NAT负载均衡和备份
- 基于策略的双出口NAT负载均衡和备份
- 基于策略的双出口NAT负载均衡和备份
- JS实现删除时的确认弹窗
- 关于计算机基础知识的理解
- HDU5547-Sodoku 数独 DFS
- poj3311
- .htaccess 基础教程(二)
- java 中文 乱码 问号