您的位置:首页 > Web前端

剑指offer:面试必备,写一个函数,求两个整数之和,要求在函数体内不得使用 、-、*、/四则运算符号。

2020-08-05 12:51 1296 查看

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

思路

既然不能用加减乘除,只能用位运算
左移( << 相当于乘法)、右移( >> 相当于除法 ) 、无符号右移( >>> ) 、位与( & ) 、位或( | )、位非( ~ )、位异或( ^ ),除了位非( ~ )是一元操作符外,其它的都是二元操作符。
用IPO来表示:

  1. Input:假设输入的数字是2和3
  2. Process:我们不能采用加法运算,但是我们可以位运算
    01+00=01 00+01=01 01+01=010
    我们可以看出基本操作是与异或 ^一样的,除了进位的地方,那我们怎么处理进位呢,我们又发现,当两个数字都为1的时候,才会产生进位操作,那么,我们用与&运算,来判断产生进位的位置,再用左移<<运算即可得出真正的进位结果,再与原数相加,往复循环,直到与运算的结果不再产生进位,结束。
    用上例,2 = 010 3 = 011 ,首先进行异或得出结果为001,发现1和1异或的结果被吞掉了,那么我们找出1和1所在位置,左移一位,得出结果,为100,这时候我们再与原运算结果相加,再次判断,两个数相加之后是否会产生进位,如果不再产生进位,即为最终正确答案。
    Output:输出结果为101
    代码如下:
public class Solution {
public int Add(int num1,int num2) {
while(num2 != 0){
//用一个数保存相加之后的结果
int temp = num1^num2;//相加各个位的值 异操作
//得到一个进位数
num2 = (num1&num2)<<1;//相加进位的值 与操作
num1 = temp;
//判断这个有无再次进位
}
return num1;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐