不用加减乘除做加法 - Java

不用加减乘除做加法 - Java

题目描述

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

输入

1,2

返回值

3

1、一位数加法

普通加法 异或
1 + 1 = 0 1 ^ 1 = 0(错误)
1 + 0 = 1 1 ^ 0 = 1(正确)
0 + 1 = 1 0 ^ 1 = 1(正确)
0 + 0 = 0 0 ^ 0 = 0(正确)

可以看到在一位数的运算中,会出现进位丢失的问题。而其他都是正常的。

那么怎么解决进位的问题呢?

与运算
1 & 1 = 1(进位)
1 & 0 = 0(不进位)
0 & 1 = 0(不进位)
0 & 0 = 0(不进位)

与运算中可以看到1&1是伪进位的,为什么说是伪进位呢?因为1和1进位应该是10.但是通过’<<'左移后进变成真正的进位了。是不是很巧妙!

所以得到下面两个表达式:

  • 执行加法 x ^ y
  • 进位操作 ( x & y ) << 1

栗子:现在有101 和 111两个数

  1. 101 ^ 111 = 0010 (没有处理进位的加法)
  2. (101&111)<< 1 = 1010(得到需要进位的数)
  3. 0010 ^ 1010 = 1000(把进位加上)
  4. (0010 & 1010) << 1 = 0010 << 1 = 00100 (进位的同时可能会出现新的进位)
  5. 一直重复,直到进位为0

方法(异或运算和与运算)

public class Solution {
    
    
    public int Add(int num1,int num2) {
    
    
        int result = 0;
        int carry = 0;
        do{
    
    
            // 异或结果
            result = num1 ^ num2;
            // 与结果
            carry = (num1 & num2)<<1;
            num1 = result;
            num2 = carry;
        }while(carry != 0);
            return result;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43957211/article/details/114924265
今日推荐