书接上回,这回的题目是求加法;
说白了就是让你自己去实现加法,因为不予许用+,-号啊亲;
这道题考点在于你对位运算的掌握,实际上二进制的加减乘除都是位运算,我想大家都会想到用位运算实现,但这题有个误区就是—不要想的太复杂;
位运算符号最基础的几个符号:&(与),|(或),~(非),^(异或),>>\<<(左右位移);
然后我们说一下“+”怎么用位运算实现:
首先,我们考虑最原始的问题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);//举一反三,亲;
}