您的位置:首页 > 其它

算法实战(二)--求加法

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)<<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);//举一反三,亲;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: