美文网首页数据结构和算法分析
Leetcode-不用加号的加法

Leetcode-不用加号的加法

作者: 风暴小狼 | 来源:发表于2020-04-23 23:08 被阅读0次

设计一个函数把两个数字相加。不得使用 + 或者其他算术运算符。

示例:

输入: a = 1, b = 1
输出: 2

提示:
a, b 均可能是负数或 0
结果不会溢出 32 位整数

解题思路

题目中要求不能使用+或者其他运算符,所以这题使用位运算符来实现。
普通的整数相加,如6+5 = 11,因为是10进制,所以进位1
同理二进制也具有这个规律,也就是逢二进一

在二进制位运算符中,异或和与运算符的规则如下:
异或^ : 相同则为0,不相同则为1
与& :如果两个数都为1则为1,否则为0

结合二进制逢二进一的特性和异或的规则,我们可以看出两个二进制进行异或的话,会舍去进位1,如 0110 ^ 1011 = 1101,第二位向第二位进的1被舍去。

被丢弃的进位该如何参与到运算中?
可以参考运算符&,如 0100 & 0101 = 0100,这个结果如果向左进行带符号位移的话,恰好能得到进位1所在的位置->1000

综上,结合上面两点,两个整数a和b相加的话,抽取的数学模型如下:
int x = a^b
int y =(a&b)<<1
不断 x^y , 直到y=0(表示没有进位了)为止。

代码如下:

class Solution {
    public int add(int a, int b) {

        while(b != 0)
        {
            int sum = a ^ b; //不带进位之和
            int carry = (a & b) << 1;  //进位,并且向左进一位,如果carry==0,说明没有进位,已经得到了结果,直接退出
            a = sum;
            b = carry;
        }

        return a;

    }
}

相关文章

  • Leetcode-不用加号的加法

    设计一个函数把两个数字相加。不得使用 + 或者其他算术运算符。 示例: 提示:a, b 均可能是负数或 0结果不会...

  • 不用加号实现加法

    题目说明 这是一道在lintcode上的简单题:http://lintcode.com/en/problem/a-...

  • 面试题 17.01. 不用加号的加法

    题意:设计一个函数把两个数字相加。不得使用 + 或者其他算术运算符。 解法1:在十进制中,3+8=1+10=11(...

  • 算数运算符

    算数运算符 加法运算符: 加法运算符由加号(+)表示: (ECMAScript中的加法也有一些特殊行为:某个运算数...

  • Pytorch学习笔记二——Tensor操作

    算术操作 加法 加号 + torch.add() tensor.add_() # inplace方式 其他数学操...

  • Leetcode.371.Sum of Two Integers

    题目 不用加法计算加法。 思路 不使用加法就只能使用位运算。需要考虑负数的加法,减法和加法应该一样,采用取反加1的...

  • css中神奇的负数

    outline-offset(负值)实现加号 能否用纯css实现加号,在不用伪类的情况下。 注意事项: 容器得是个...

  • 2015年Java方向C组第七题

    标题:加法变乘法 我们都知道:1+2+3+ ... + 49 = 1225 现在要求你把其中两个不相邻的加号变成乘...

  • JavaScript 相加

    加法 javascript 使用加号进行相加时会默认将两个数字进行连接,可通过以下方法进行解决: 变量前分别加上+...

  • 运算符

    算术运算符 只有加号用注意。+除了表示加法和正号,还能做字符串连接符。例如hello +a+ 1和1 + a +...

网友评论

    本文标题:Leetcode-不用加号的加法

    本文链接:https://www.haomeiwen.com/subject/yaftwhtx.html