题扣面试题:面试题65. 不用加减乘除做加法
题目链接:https://leetcode-cn.com/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof/
题目要求:
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
示例 1:
输入: a = 1, b = 1
输出: 2
提示:
a, b 均可能是负数或 0
结果不会溢出 32 位整数
解题思路
看到这道题,你脑子里是否有很多问号???
我能想到的有两种方法:
1、用函数代替 运算符,其实就是取巧,没有根本解决这个问题。
2、采用位运算操作
位运算
因为不能使用加减乘除四则运算,所以只能想到使用二进制的位运算实现相加操作
二进制位运算中,异或操作: 1^1=0 0^0=0 1^0=1 0^1=1,可以模拟无进位的加操作;
与操作:1&1=1 0&1=0 1&0=0 0&0=0,可以模拟进位的情况,再将与后的值左移一位即等于进位值。 普通的十进制数相加过程是:
1) 各位相加,无进位和
2) 计算进位值
3) 无进位和加上进位值
使用位运算的二进制数的相加过程相同:
1) 两个二进制数各位异或,得到无进位的和
2) 二进制数各位与再左移,计算进位
3) 无进位和与进位异或
重复上面操作,直到不再有进位,即进位为0。
相关问题: 不使用新的变量,交换两个变量的值。比如有两个变量a、b,希望交换它们的值。有两种不同的操作: 1.基于加减法 – a = a + b; b = a - b; a = a - b;
2.基于位运算 – a = a ^ b; b = a ^ b; a = a ^ b;
解法
java解法
class Solution {
public int