剑指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

推荐阅读更多精彩内容

  • 剑指 offer 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成...
    faremax阅读 1,147评论 0 7
  • •1 C语言程序的结构认识 用一个简单的c程序例子,介绍c语言的基本构成、格式、以及良好的书写风格,使读者对c语...
    CONLYOUC阅读 6,989评论 10 64
  • 题目要求:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。 仔细一看这题颇有意思,求...
    豆豆先生的小屋阅读 1,032评论 0 2
  • 谨记: 上帝在缔造每个人的时候,给予每个人的一切都是相同的,然而,人与人却是存在如此大的差距,记着上帝为你关上了一...
    长风留言阅读 2,395评论 0 3
  • 单位:宁波大发化纤有限公司 组名:杭州234期乐观一组 绍兴260期努力三组 【知~学习】 《六项精进...
    大发化纤梁德宝阅读 32评论 0 0