剑指offer——不用加减乘除做加法

题目:

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

题目中要求不要加减法实现加法,数据的处理除了四则运算外,最常用的就是位运算。

对于十进制的加法如何计算呢?
比如 266+58,原来的处理方式做个位与个位加,逢10进1。
可以将上述过程拆分开:
第一步:各位相加不进位。(个位6+8=14,只取4,十位5+6=11,只取1,百位2+0=2 )第一步得到值为214
266
58
214
第二步:只取进位。(6+8=14,只取10,十位5+6=11,只取百位的1,即为100,)第二步得到的值为110
第三步:将上述两步值累加求得324。

上述思路与平时的求和类似,只不过将低位与高位的计算分开。

将十进制的计算逻辑运用到二进制,也分三步走

  1. 各位相加不进位。
  2. 各位相加只取进位。
  3. 将一二两步结果相加。

比如5的二进制为101,17的二进制为10001,尝试用三步计算出来
第一步:
10001
****101+
10100

第二步:
10001
***101 +
00010

第三步:
10100
00010+
10110

将10110转化为十进制即为22。

上述过程中,不取进位本质是 二进制位不同的时候为1,相同的时候则为0,这本质是异或运算。

算数结果
1^10
1^01
0^11
0^00

而只取进位,本质是一种与运算,但是为了表示进位过程,需要将与之后的结果左移。

综上代码如下:

public class Solution {
    public int Add(int num1,int num2) {
        // 表示和
        int sum = 0;
        // 表示进位
        int carry = 0;
        while(num2 != 0){
            // 不取进位
            sum = num1 ^ num2;
            // 取进位
            carry = (num1 & num2) << 1;
            num1 = sum;
            num2 = carry;
        }
        return num1;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值