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

书接上回,这回的题目是求加法
说白了就是让你自己去实现加法,因为不予许用+,-号啊亲;
这道题考点在于你对位运算的掌握,实际上二进制的加减乘除都是位运算,我想大家都会想到用位运算实现,但这题有个误区就是—不要想的太复杂;

位运算符号最基础的几个符号:&(与),|(或),~(非),^(异或),>>\<<(左右位移);

然后我们说一下“+”怎么用位运算实现:
首先,我们考虑最原始的问题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 sumint 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);//举一反三,亲;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值