不用加法计算两数之和
所有的进制的计算放到计算机内部都是二进制的计算,而二进制无非 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; }

浙公网安备 33010602011771号