不用加法计算两数之和

所有的进制的计算放到计算机内部都是二进制的计算,而二进制无非 0 和 1;

0011 和 0101 的和为

1000(十进制8)

1、得到他们的进位制

这里只要满足两个对应位为1就可以进位,对应位为 0 或其他 0  1 组合不用进位

  0 0 1 1

&     0 1 0 1

————————

       0 0 0 1  << 1    左移一位就可以得到下面的对应的进位

_______________ 

       0 0 1 0

计算十进制数我们可以知道  89+12, 个位相加进位到十位,十位相加进位到百位,二进制同理

那么我们得出进位值是 0010;

2、得到他们的异或值

我们再求出不考虑进位情况下的结果,就是两数异或,两数异或相同位为0 , 不同位为 1 .

  0 0 1 1

^   0 1 0 1

____________

  0 1 1 0

如果两个数相与为0, 那么这两个数各个对应位相加就不会进位,那么他们的异或值就是他们的和。

 

而通过计算也可以知道,两个数的和即为他们的进位值异或值之和,而进位值即为他们的与值左移得到。这样,我们可以重复上面1,2步骤,直到他们的与值为0。

下面直接上程序

int aplusb(int a, int b)
{
   int CF;  // 此为他们的进位值
   CF = (a & b) << 1;
   a ^= b;    // 这样如果 CF为0,那么a就是 a和 b 的和

//若CF不为0
  while(CF)
  {
    b = CF; // 现在计算他们的异或值 a 和 进位值 CF之间的和    CF
= (a & b) << 1; // 继续求其进位制    a ^= b; //同时计算他们的异或值,只要CF为0,a即为 a,b的和   }   return a; }

 

posted @ 2020-08-19 23:05  阿拉灯神丁0  阅读(456)  评论(0)    收藏  举报