点击此处返回总目录

 

 

【题目】

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。

 

【代码】

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

 

 

【结果】

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

 

 

 

 

 

 

 

 

 

相关文章: