剑指offer 面试题47 不用加减乘除做加法

剑指offer 面试题47 不用加减乘除做加法

题目:
写一个函数,求两个整数之和,要求在函数体内不得使用加减乘除四则运算。

package algorithm.foroffer.top50;

import org.junit.Test;

/**
 * description:
 *
 * @author liyazhou
 * @create 2017-06-03 22:01
 *
 * 面试题 47:不用加减乘除做加法
 *
 * 题目:
 *      写一个函数,求两个整数之和,要求在函数体内不得使用加减乘除四则运算。
 *
 * 考查点:
 *      1. 位运算
 *
 * 思路:
 *      比如计算 5 + 97,
 *      第一步,两个整数的各个对应为相加,每位相加产生的结果不进位。个位是 5 + 7 = 2,十位是 0 + 9 = 9,结果是 92
 *      第二步,只取各位相加产生的进位。个位相加 5 + 7,进位是 10,十位相加 0 + 9,进位是 0
 *      第三步,把第一步产生的不进位结果与第二步产生的所有的进位累加,结果即为所求。92 + 10 + 0 = 102
 *
 *      同理,使用这种方法对二进制数字计算也是成立的。
 *
 */
public class Test47 {

    public int add(int num1, int num2){
        int sum, carry;
        do{  // 从低位到高位循环做进位运算
            sum = num1 ^ num2;  // 不进位相加
            carry = (num1 & num2) << 1; // 进位产生的数字

            num1 = sum; // 加上一次进位数字的结果
            num2 = carry;  // 进的位数,在下一轮循环中,做不进位运算
        }while (num2 != 0);

        return num1;
    }

    @Test
    public void test(){
        System.out.println(add(12, 5));
        System.out.println(add(-12, 5));
        System.out.println(add(-12, -5));
        System.out.println(add(12, 0));
    }

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值