剑指offer四十八之不用加减乘除做加法

一、题目

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

二、思路

1、 采用位运算的方法,分三步:   (1)、两个数异或:相当于每一位相加,而不考虑进位   (2)、两个数相与,并左移一位:相当于求得进位   (3)、重复步骤1和2,两个数相与的结果为0,和即为两个数异或的结果 2、例子演示:   3+11 = ?   13 的二进制      1 1 0 1                     —–a        13 11 的二进制      1 0 1 1                     —–b        11  

 (a&b) <<1  ->   1 0 0 1
0                 —–d         18             a^b  ->     0 1 1
0                   —–e          6

 (d&e) <<1  ->   0 0 1
0 0                 —–f         4             d^e  ->  1 0 1
0 0                  —–g        20

 (f&g) <<1  ->   0 1
0 0 0                ——h        8             f^g  ->  1 0
0 0 0                 ——i           16

 (h&i) <<1  ->   0
0 0 0 0
              ——h        0       —- ——–退出循环             h^i  ->  1 1 0 0 0                ——i           24 在第一步中,采用异或 第二步中,采用按位与,左移一位

三、代码

public class Solution {
    public int Add(int num1,int num2) {
        while( num2!=0 ){ //当进位等于0的时候,返回异或的结果,即是要求的和
            int sum = num1 ^ num2; //两个数异或:相当于每一位相加,而不考虑进位
            int carray = (num1 & num2) << 1;//两个数相与:并左移一位:相当于求得进位
            num1 = sum;
            num2 = carray;
        }
        return num1;
    }
}

View Code

———————————————

参考链接:

https://www.nowcoder.com/questionTerminal/59ac416b4b944300b617d4f7f111b215

    原文作者:hezhiyao
    原文地址: https://www.cnblogs.com/hezhiyao/p/7662249.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注