不用加减乘除做加法

题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用 +、-、*、/ 四则运算符号。

分析:

& 按位与运算:相同位的两个数字都为 1,则为 1;若有一个不为 1,则为 0。两个数相与,并左移一位:相当于求得进位。

    如:1&1=1 将 1 左移一位变成了 10,相当于拿到了进位。
^ 按位异或运算:相同位置不同则为 1,相同则为 0。相当于每一位相加,而不考虑进位。

十进制两个数相加可以进行分解为三个步骤:

1、各位的值进行相加,不算进位的值

2、计算进位的值

3、两者相加即为和

例子:5 + 7 = 12,三步走。

           5 --> 101      7 --> 111

第一步:相加各位的值,不算进位,得到 010,二进制每位相加就相当于各位做异或操作,101^111。

第二步:计算进位值,得到 1010,相当于各位做与操作,得到 101,再向左移一位,得到 1010,(101 & 111) << 1。

第三步:重复上述两步,各位相加 010 ^ 1010 = 1000,进位值为 (010 & 1010) << 1 = 100,继续重复上述两步,1000 ^ 100 = 1100,进位值为 0,跳出循环,1100 为最终结果。

public class Solution {
    public int Add(int num1,int num2) {
        int result = 0;
        int carry = 0;
        do {
            result = num1 ^ num2;        // 不带进位的加法
            carry = (num1 & num2) << 1;  // 进位
            num1 = result;
            num2 = carry;
        } while(carry != 0);  // 进位不为 0 则继续执行加法处理进位
        return result;
    }
}

 

上一篇:Cisco交换机日常操作


下一篇:计算机是怎样跑起来的-(五)使用编程技巧提升程序执行速度