剑指offer_不用加减乘除做加法

题目描述

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

先导知识

http://glgjing.github.io/blog/2015/04/03/markdown-biao-ge-yu-fa/
1. 一位二进制加法真值表:

xysumcarry
0000
0110
1010
1101

2. 多位二进制加法
因此进行一位二进制加法,只要对x和y进行XOR和AND运算就可以得出和以及进位。如果要求多位的二进制加法,则要把低位传上来的进位也要计算进去。修改一位二进制加法的真值表,在输入部分中加入低位传入的进位,然后对计算结果进行修正就可以得到多位二进制加法的真值表了。

xyicarrysumocarry
00000
00110
01010
01101
10010
10101
11001
11111

解题思路

我们通过对x和y进行&位运算,得出每一位上的进位。然后对x和y进行^位运算,得出没有加进位的和。最后将所得的和当做新的x,所得的进位往左移一位(第零位的进位输入为0)当做新的y,继续做上面的步骤,直到进位为0,此时x中保存的就是我们要求的x和y的和了。

Java实现

public class Solution {
    public int Add(int num1,int num2) {
        while(num2 != 0){
            int temp = num1^num2;
            num2 = (num1 & num2) << 1;
            num1 = temp;
        }
        return num1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值