書接上回,這回的題目是求加法;
說白了就是讓你自己去實現加法,因爲不予許用+,-號啊親;
這道題考點在於你對位運算的掌握,實際上二進制的加減乘除都是位運算,我想大家都會想到用位運算實現,但這題有個誤區就是—不要想的太複雜;
位運算符號最基礎的幾個符號:&(與),|(或),~(非),^(異或),>>\<<(左右位移);
然後我們說一下“+”怎麼用位運算實現:
首先,我們考慮最原始的問題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);//舉一反三,親;
}