剑指offer第二版-65.不用加减乘除做加法

本系列导航:剑指offer(第二版)java实现导航帖

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

题目要求:
写一个函数,求两个正数之和,要求在函数体内不能使用四则运算符号。

解题思路:
不能用四则运算,那只能通过位运算了。其实四则运算是针对十进制,位运算是针对二进制,都能用于运算。下面以0011(即3)与0101(即5)相加为例说明

1.两数进行异或:  0011^0101=0110 这个数字其实是把原数中不需进位的二进制位进行了组合
2.两数进行与:    0011&0101=0001 这个数字为1的位置表示需要进位,而进位动作是需要向前一位进位
3.左移一位:      0001<<1=0010

此时我们就完成0011 + 0101 = 0110 + 0010的转换

如此转换下去,直到其中一个数字为0时,另一个数字就是原来的两个数字的和

代码实现如下

package chapter6;

/**
 * Created with IntelliJ IDEA
 * Author: ryder
 * Date  : 2017/8/20
 * Time  : 21:03
 * Description:不用加减乘除做加法
 **/
public class P310_AddTwoNumbers {
    public static int add(int a,int b){
        int sum = a^b;
        int carry = (a&b)<<1;
        int temp;
        while (carry!=0){
            temp = sum;
            sum = sum^carry;
            carry = (carry&temp)<<1;
        }
        return sum;
    }
    public static void main(String[] args){
        System.out.println(add(3,5)); //8
        System.out.println(add(3,-5)); //-2
        System.out.println(add(0,1));  //1
    }
}

运行结果

8
-2
1
    原文作者:ryderchan
    原文地址: https://www.jianshu.com/p/e1e77b010ecc#comments
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞