面试题65-不用加减乘除做加法

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

示例:
输入: a = 5, b = 17
输出: 22

题目分析:

第一步:不进位加法。相加各位的值,不算进位,得到12。
第二步:记录进位。5+17中十位要进一,因此表示10。
第三步:将前面的结果相加: 12+10=22。

第一步和第二步皆可以利用逻辑操作代替。

第一步:逻辑异或(相同为0,不同为1)。5的二进制表示为:00101B,17的二进制表示为10001B ,逻辑异或操作为 10100B。
第二步:逻辑与(二者皆为1的时候为1,其他都是0)。5和17进行逻辑与操作为1B,向左移动一位 得到10B,这才能表示高位对应的权值。

第三步:重复第一步,不过当前的值为10100B^10B,异或得到10110B。
第四步:重复第二步,10100B&10B=0,说明没有进位,向左移动也还是0。边界条件出现,直接返回第三步的值10110B,即 22。

Java代码:
/**
 * 写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
 *
 * 示例:
 * 输入: a = 1, b = 1
 * 输出: 2
 */
public class Offer65 {
	// 官方答案,更加精炼。佩服!
    public int add(int a, int b) {
        while (b!=0){
            int xr = a^b;
            b = (a&b)<<1;
            a = xr;
        }
        return a;
    }
	// 自己根据官方思路写的代码。
    public int add1(int a, int b) {
        int xor = 0;
        int and = 0;
        while (b!=0){
            xor = a^b;
            and = (a&b)<<1;
            a = xor;
            b = and;
        }
        return a;
    }

    public static void main(String[] args) {
        Offer65  offer65 = new Offer65();
        int result = offer65.add1(6,-9);
        System.out.println(result);
        int result1 = offer65.add1(6,0);
        System.out.println(result1);
        int result2 = offer65.add1(0,49);
        System.out.println(result2);
    }
}

【注】
(1):leetcode 等平台只要我们完成一个函数即可,本人初出茅庐,为了巩固基本知识,故自己补充了部分代码,用于练手。本代码也许存在漏洞,望高手赐教。感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值