371  不使用加减运算求两数之和

                                                                                                                                              点击此处返回总目录

 

 

【题目】

 

 

【分析】

正数的原、反、补是一样的。

负数的源码等于反码+1.

比如-7:

源码:1000 0111

反码:1111 1000(符号位不取反)

+1   :1111 1001

所以-7的补码为:1111 1001

 

我们来看一下两个数相加的运算过程:

 

-7+12 = 5

12的二进制位:0000 1100

   1111 1001 

+ 0000 1100

----------------

  1 0000 0101

多的1丢掉,结果为:0000 0101,即5。

 

分来来看就是:两个二进制相加的结果为:本位相加+上一位的进位。即:

   1 1 1 1 1 0 0 1

+ 0 0 0 0 1 1 0 0

等于:

   1 1 1 1 0 1 0 1                             //本位相加的结果

+ 0 0 0 0 1 0 0 0 向左移一位           //前一项的进位

 

本位相加的结果为:1?1 = 0       1?0 = 1      0?0 = 0。异或操作可以满足。

本位的进位的结果为:1?1 = 1     1?0 = 0      0?0 = 0 。与操作可以满足。

 

两个数相加又可以递归来做。进位会越来越上进,所以右边的0越来越多。最后进位变成0(没有进位或者进位越界),递归终止。

 

比如:

       1 1 1 1 1 0 0 1 

    + 0 0 0 0 1 1 0 0

-------------------------

=     1 1 1 1 0 1 0 1   (a^b)

 + 0 0 0 0 1 0 0 0 0   (a&b<<1)

-------------------------

=     1 1 1 0 0 1 0 1

+  0 0 0 1 0 0 0 0 0

-------------------------

=     1 1 0 0 0 1 0 1 

+  0 0 1 0 0 0 0 0 0

-------------------------

=     1 0 0 0 0 1 0 1 

+  0 1 0 0 0 0 0 0 0

-------------------------

=     0 0 0 0 0 1 0 1 

+  1 0 0 0 0 0 0 0 0   (a&b<<1得0了)

 

结果为:00000101。

 

【代码】

 

 

【结果】

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值